二分查找

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,以免溢出


後記:

簡單是最極致的複雜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章