https://blog.csdn.net/zhouyelihua/article/details/46665931
还要练下变形题啦!
https://www.cnblogs.com/coser/archive/2011/04/11/2013013.html
在百度百科里面是这样描述的:“二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
该算法有两个名字(二分查找、折半查找)、优点三个(比较次数少、查找速度快、平均性能好)、缺点两个(待查找表为有序表、插入删除困难)。
public static void main(String[] args) {
int[] arr ={0,1,2};
int res =binarySearch(arr,3,0);
System.out.println(res);
}
//正确的二分查找法
public static int binarySearch(int a[], int n, int key)
{
int low = 0;
int high = n - 1;
int mid;
//while(low < high) //key可能刚好在low与high相等的地方
while(low <= high) //key可能刚好在low与high相等的地方
{
mid = (low + high)/2;
if(key == a[mid])
return mid;
if(key < a[mid])
high = mid - 1;
//high = mid; 可能死循环
else
low = mid + 1;
//low = mid; 可能死循环
}
return -1;
}
注意事项 一:mid溢出
针对上文代码中
mid=(left+right)/2;
这一句代码有两个注意事项:
1.计算机方式有乘以2n或者是除以2n都可以利用移位代替。所以上述代码可以改为:
mid=(left+right)>>1;
注意事项 二:常数步的前进
这个错误在编程珠玑中也有提到的,但是自己还是经常放错误。
还是原来的那段代码很多人容易写成
left=mid+1 ==》 left=mid;
right=mid-1 ==》 right=mid;