1.为什么要使用二分查找
在数据量很大的情况下,直接使用全遍历查找时,性能太低
2.二分查找的实现方式
使用二分查找的前提是要查找的列表是排好序的,如果不是有序的,需要Arrays.sort()一下。
下面是分别使用循环和递归两种形式的二分查找的实现:
循环法
/**
* 循环法实现二分查找
* @param arr 查找的有序数组
* @param key 查找的值
* @return 找到的值在数组的位置,没找到返回-1
*/
public static int loopBinarySearch(int[] arr, int key) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == key)
return mid;
else if (arr[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
递归法
/**
* 递归法实现的二分查找
* @param arr
* @param key
* @return 找到的值在数组的位置,没找到返回-1
*/
public static int recursionBinarySearch(int[] arr, int key) {
int low = 0;
int high = arr.length - 1;
return recursionBinarySearch(arr, key, low, high);
}
private static int recursionBinarySearch(int[] arr, int key, int low, int high) {
if (low > high) return -1;
int mid = low + (high - low) / 2;
if (arr[mid] == key)
return mid;
else if (arr[mid] < key) {
return recursionBinarySearch(arr,key,mid + 1,high);
} else {
return recursionBinarySearch(arr,key,low,mid - 1);
}
}