原理
将有序数组的中间值(最小索引和最大索引之和除以2取整的索引所对应的值)和查找值比较,如果相等,则返回。如果不相等,那么从把有序数组从中间值分成2部分:左边和右边(根据索引进行区分)。如果中间值大于查找值,那么从左边部分重复上面的步骤进行查找。如果小于查找值,那么从右边部分重复上面步骤进行查找。
分析
这种查找适合有序的情况,如果无序必须先排序
代码实现
/* *
* 这个是while循环版本,采用递归也可以
* 如果没有查找到,那么返回的是负数,而且是待插入的数据位置
*/
public static int halfSearch_2(int[] arr,int key)
{
int max,min,mid;
min = 0;
max = arr.length-1;
while(min<=max)
{
mid = (max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -min-1;
}
复杂度分析
计算最坏情况,也即是最后一次(m)二分的时候,只有一个元素的。
第一次二分剩下: n/2
第二次二分剩下:n/2/2=n/22
第m次二分:n/2m = 1
m = log2n
所以复杂度是 log2n