原理:二分查找的基础是已有数组是有序的,将有序数组从中间分成两个部分,低值和高值,通过比较指定数值与中间值得大小来确定指定值属于低值部分还是高值部分,若指定数值大于中间值则去高值数组中继续查找,若指定数值小于中间值则去低值数组中继续查找,若相等则直接返回;
代码:
/**
* 二分查找 - 循环方式
* @param arr
* @param target
* @return 查找元素的数组下标
*/
public static int pointLookup(int[] arr, int target) {
int low = 0;
int high = arr.length - 1;
int index = 0;
while (low <= high) {
int middle = (low + high) / 2;
if (target == arr[middle]) {
return middle;
} else if (target > arr[middle]) {
low = middle + 1;
} else {
high = middle -1;
}
}
return -1;
}
/**
* 二分查找 - 递归
* @param arr
* @param target
* @param low
* @param high
* @return
*/
public static int pointLookup(int[] arr, int target, int low, int high) {
int middle = (low + high) / 2;
if (low > high || target < arr[low] || target > arr[high]) {
return -1;
} else if (target == arr[middle]) {
return middle;
} else if (target > arr[middle]) {
return pointLookup(arr, target, middle + 1, high);
} else {
return pointLookup(arr, target, low, middle - 1);
}
}