public int binarySearchV1 (int[] array, int low, int high, int key) {
if(low > high)
return -1;
int mid = low + ((high-low)>>>1);
if(array[mid]> key){
return binarySearchV1(array, low, mid -1 , key);
} else if(array[mid] < key){
return binarySearchV1(array, mid+1, high, key);
}else {
return mid;
}
}
public int binarySearchV2(int[] array, int key){
int low = 0;
int high = array.length -1;
while(low <= high){
int mid = low + ((high - low)>>>1);
if (array[mid] > key){
high = mid -1;
} else if (array[mid] < key){
low = mid + 1;
} else {
return mid;
}
}
return -1;
}
@Test
public void testBinarySearch(){
int[] array = {1,3,5,7,9,11};
int low = 0;
int high = array.length - 1;
int key = 9;
int re = binarySearchV1(array, low, high, key);
System.out.println(re);
int re2 = binarySearchV2(array,key);
System.out.println(re2);
}
注:
1.思想:
有序的序列,每次都是以序列的中間位置的數來與待查找的關鍵字進行比較,每次縮小一半的查找範圍,直到匹配成功。
2.使用條件:
查找序列是順序結構,有序。
3.int
mid = low+((high-low)>>>
1
);
//((high-low)>>>
1
)等價於(high-low)/2;右移一位,相當於除以2,但右移的運算速度更快
//若使用(low+high)/2求中間位置容易溢出
,若 low+high > Interger.MAX_VALUE 時,此時會導致數據溢出,則導致mid錯誤,所以 mid 應該改爲 low +(high - low)/ 2;這樣能使得mid的值保持正確。也能方便其他由二分查找法所改的查找法mid公式的記憶。
二分查找法圖示:
參考地址:
https://blog.csdn.net/maoyuanming0806/article/details/78176957