1、問題描述
在一個有序的數組中,找到給定數,如果沒有則返回-1,如果找到則返回相應索引。
2、原來沒那麼簡單
《編程珠璣》的作者Jon Bentley曾在貝爾實驗室做過一個實驗,即給一些專業的程序員幾個小時的時間,用任何一種語言編寫二分查找程序(寫出高級僞代碼也可以),結果參與編寫的一百多人中:90%的程序員寫的程序中有bug。而且高德納在《計算機程序設計的藝術
第3卷 排序和查找》第6.2.1節的“歷史與參考文獻”部分指出,雖然早在1946年就有人將二分查找的方法公諸於世,但直到1962年纔有人寫出沒有bug的二分查找程序。
3、我的代碼
public class BinarySearch {
public int binarySearch(int[] array,int start,int end,int key){
int low=start,high=end;
while(low<=high){
int mid=low+((high-low)>>1); //注意!!!如果用(low+high)/2可能出現溢出的情況
if(key==array[mid]){
return mid;
}
if(array[mid]>key){
high=mid-1;
}else{
low=mid+1;
}
}
return -1;
}
public static void main(String[] args) {
BinarySearch bi=new BinarySearch();
int[] array={2,4,5,8,12};
System.out.print(bi.binarySearch(array, 0, array.length-1, 8));
}
}
注意的問題:
1、邊界問題
2、while的條件,就根據不同情況(即邊界的選定)來確定
3、溢出問題,不要使用mid=(low+high)/2,以免溢出
後記:
簡單是最極致的複雜