1.簡介
這裏所講解的簡單的二分查找指的是在一個有序無重複元素的int類型的數組中查找需要的元素。
2.代碼
public int binarySearch(int[] a ,int value){
int low = 0, hi = a.length - 1;
while(low <= hi){
int mid = low + ((hi - low)>>1);
if(a[mid] == value){
return mid;
}else if(a[mid] < value){
low = mid + 1;
}else if(a[mid] > value){
hi = mid - 1;
}
}
return -1;
}
代碼分析
舉例:數組
int[] a = {2,3,5,7,8,10};
-
low <= hi
在進行二分查找的時候,當低位指針和高位指針相遇時,如果還沒有找到要找的元素,這個時候就可以跳出循環了。 -
low = mid + 1
low不能mid(low=mid),假設low=mid,hi=mid - 1;當我們要找的元素 value >= max(數組中最大的元素),我們會找不到元素,也無法跳出循環 以舉例數組爲例,當我們要找 10 時,當 low = mid 這一步使 low = 4時;這時 low<=hi, int mid = low + ((hi - low)>>1) = 4, 這時mid的值沒法再增加,low也會一直爲4,雖然數組中有10,但是我們無法跳出循環,也無法找到10。 -
hi = mid - 1
hi不能爲mid(hi=mid),假設 low = mid + 1 , hi = mid;當我們要找的元素 value < min(數組中最小的元素),數組中沒有元素,但是無法跳出循環。以舉例數組爲例,當我們要找1時, 當 hi = mid 這一步使 hi = 0時;這時 low<=hi,int mid = low + ((hi - low)>>1) = 0, 這時 mid的值沒法再減小, hi也會一直爲0,雖然數組中沒有1,但是無法跳出循環。
總結
在對一個有序無重複的int數組進行二分查找的時候,就是不斷的折半,直到高低位指針相遇跳出循環。還有要注意的就是當折半後low = mid + 1和hi = mid - 1 這些小細節。