java中折半法查找方法
Java折半法查找方法 折半法查找是一种常用的查找算法,适用于已排序的数组。该算法的基本思想是将数组分成两部分,然后通过比较目标值与中点值的大小来确定目标值所在的半区间,如此反复直到找到目标值或确定目标值不存在。 在Java中,折半法查找可以使用递归和非递归两种方法实现。下面我们将详细介绍这两种方法的实现。 非递归实现 非递归实现的折半法查找算法可以使用以下步骤: 1. 初始化低位索引`low`和高位索引`high`,分别设置为数组的起始索引和结束索引。 2. 计算中点索引`mid`,即`low`和`high`的平均值。 3. 将目标值与中点值比较,如果目标值小于中点值,则将高位索引`high`设置为`mid - 1`,否则将低位索引`low`设置为`mid + 1`。 4. 重复步骤2和3,直到找到目标值或确定目标值不存在。 在Java代码中,这个算法可以实现为: ```java public int search(T key) { int low = 0; int high = data.length - 1; while (low <= high) { int mid = (low + high) / 2; System.out.println("mid " + mid + " mid value:" + data[mid]); if (key.compareTo(data[mid]) < 0) { high = mid - 1; } else if (key.compareTo(data[mid]) > 0) { low = mid + 1; } else if (key.compareTo(data[mid]) == 0) { return mid; } } return -1; } ``` 递归实现 递归实现的折半法查找算法可以使用以下步骤: 1. 定义一个递归函数,接受低位索引`low`和高位索引`high`作为参数。 2. 在递归函数中,计算中点索引`mid`,即`low`和`high`的平均值。 3. 将目标值与中点值比较,如果目标值小于中点值,则递归调用自己,传入新的低位索引`low`和高位索引`mid - 1`,否则递归调用自己,传入新的低位索引`mid + 1`和高位索引`high`。 4. 如果找到目标值,返回其索引,否则返回-1。 在Java代码中,这个算法可以实现为: ```java private int doSearchRecursively(int low, int high, T key) { int mid; int result; if (low <= high) { mid = (low + high) / 2; result = key.compareTo(data[mid]); System.out.println("mid " + mid + " mid value:" + data[mid]); if (result < 0) { return doSearchRecursively(low, mid - 1, key); } else if (result > 0) { return doSearchRecursively(mid + 1, high, key); } else if (result == 0) { return mid; } } return -1; } ``` 折半法查找的时间复杂度 折半法查找的时间复杂度为O(log n),其中n是数组的长度。这是因为每次折半法查找都将搜索范围减半,直到找到目标值或确定目标值不存在。 折半法查找的优点 折半法查找的优点是: * 高效:折半法查找的时间复杂度为O(log n),使其非常适合大型数组的查找。 * 简洁:折半法查找的算法实现非常简洁,易于理解和实现。 折半法查找的缺点 折半法查找的缺点是: * 需要已排序的数组:折半法查找要求数组已经排序,这可能需要额外的时间和空间复杂度。 * 不适合小型数组:对于小型数组,折半法查找的时间复杂度可能高于线性搜索的时间复杂度。
- tian154842013-02-26好东西啊..这样提供两个方法确实不错
- millerhan2014-01-09一般般吧,随随便便可以写出来啊
- Light_Archon2013-05-14可用,适合手比较懒的。。。
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助