折半查找----又称为二分查找,这种查找方法需要待查的查找表满足两个条件:首先,查找表必须使用顺序存储结构;其次,查找表必须按关键字大小有序排列。
下面通过一个实际的例子来分析折半查找算法的执行步骤。假设有如下经过排序的数据:3 、12 、31 、42 、54 、59 、69 、77 、90 、97 。待查找关键字为42 。在折半查找过程如下:
(1) 取中间数据项mid 与待查找关键字42 对比, mid 项的值大千42 。因此, 42 应该在数据的前半部分。
(2) 取前半部分的中间数据项mid 与待查找关键字42 对比, mid 项的值小于42 。因此,42 应该在数据的后半部分。
(3) 取后半部分的中间数据项mid 与待查找关键字42 对比, mid 项的值小于42 。因此,42 应该在数据的后半部分。
(4) 最后数据仅剩一项,将其作为mid 与待查找关键字42 对比,正好相等,表示查找到该数据。这样,经过4 次比较便查找到42 所在的位置.
![646ffb9dc7c4371e75dc28a702862360.png](https://i-blog.csdnimg.cn/blog_migrate/84200b9efff2b708809b9baab1976844.jpeg)
以下代码展示:
private static int binarySearch(int[] arr, int key){
if(arr == null)
return -1;
int len = arr.length;
if(len == 0)
return -1;
//定义最小和最大索引
int low = 0;
int high = len -1;
int mid = low + high >> 1;
if(key < arr[low] || key > arr[high])
return -1;
while(high >= low){
//三种情况
if(arr[mid] == key){
return mid;
}else if(arr[mid]< key){//去右边找
low = mid + 1;
}else{
high = mid -1;
}
//再次二分
mid = low + high >> 1;
counter ++;
}
return -1;
}
在最坏的情况下,折半查找所需的比较次数为O(nlog2n),其查找效率比顺序查找法要快很多。