二分查找的條件是對一組有序數組的查找,這一點很容易忘記,在使用二分查找的時候先要對數組進行排序。
先說一下二分查找的思路:一個有序數組,想要查找一個數字key的下標,首先算出中間下標mid,利用mid把這個數組分為兩半,前一半從下標0到mid-1,后一半從mid+1到數組最后一個元素(下標是數組長度減一)。把這個查找的元素key和數組下標為mid的元素進行比較,也就是和中間那個元素進行比較,如果比這個元素的小那么把查找范圍縮小到原數組的前一半(把查找下標縮短到0到mid-1),如果比中間mid下標元素大那么范圍就是后半部分(下標為mid+1到數組長度減一),這樣來回反復取中間比較最后就會定位到要查找元素key的下標。
二分查找有兩種實現方式:
- 非遞歸實現
- 遞歸實現
在jdk源碼中Arrays數組工具類中已經封裝好了二分查找算法,不會寫可以看看源碼,源碼實現的方式肯定是效率比較高的。比如計算數組中間下標mid利用移位運算。

非遞歸實現:
/**
* @param array 操作數組
* @param key 查找元素
* @return 元素下標
*/
public static int binSearch(int[] array,int key){
int start=0;
int mid;
int end=array.length-1;
while(start<=end){
mid=(end-start)/2+start;
if(key<array[mid]){
end=mid-1;
}
else if(key>array[mid]){
start=mid+1;
}else{
return mid;
}
}
return -1;
}
遞歸實現:
/**
* @param array 操作數組
* @param key 查找元素
* @param start 開始下標
* @param end 結束下標
* @return 元素下標
*/
public static int binSearch1(int[] array,int key,int start,int end){
int mid=(end-start)/2+start;
if(key==array[mid]){
return mid;
}
else if(start>=end){
return -1;
}
else if(key>array[mid]){
return binSearch1(array,key,mid+1,end);
}
else if(key<array[mid]){
return binSearch1(array,key,start,mid-1);
}
return -1;
}
