二分查找,也叫做折半查找。
二分查找是在已經拍好序的數組中,每次取中間值與待查關鍵字比較,如果中間位置的值筆待查關鍵字大,則在前半部分循環這個查找的過程,如果中間位置的值比待查關鍵字小,則在后半部分循環這個查找的過程。直到找到了為止,否則序列中沒有待查的關鍵字。
public static int binarySearch(int[] arr, int k){
int low = 0;
int high = arr.length - 1;
int mid;
while(low <= high){
mid = (low + high) >> 1;
if(arr[mid] == k){
return mid;
}else if(arr[mid] > k){
high = mid - 1;
}else{
low = mid + 1;
}
}
return -1;
}
也可以采用遞歸實現
public static int binarySearchByRecursion(int[] arr, int k, int low, int high){
if(low < high){
int mid = (low + high) >> 1;
if(k == arr[mid]){
return mid;
}
else if(k > arr[mid]){
return binarySearchByRecursion(arr, k, mid + 1, high);
}else{
return binarySearchByRecursion(arr, k, low, mid - 1);
}
}
return -1;
}
變種1,假設數組中存在值相同的元素,找到第一個這個值出現的位置:
public static int binarySearchFirstElement(int[] arr, int k){
int low = 0;
int high = arr.length - 1;
int mid;
while(low < high){
mid = (high + low) >> 1;
if(arr[mid] < k){
low = mid + 1;
}else{
high = mid;
}
}
if(arr[low] != k){
return -1;
}else{
return low;
}
}
變種2,條件同上,找到最后一個這個值出現的位置
public static int binarySearchLastElement(int[] arr, int k){
int low = 0;
int high = arr.length - 1;
int mid;
while(low < high){
mid = (high + low + 1) >> 1;
if(arr[mid] <= k){
low = mid;
}else{
high = mid - 1;
}
}
if(arr[low] != k){
return -1;
}else{
return high;
}
}