二分查找
- 功能:二分查找接受一个待查找的整数
target
和一个有序的int
数组a
作为参数。如果target
存在于数组中,则返回它的索引,否则返回-1
。 - 前提:数组
a
有序。 - 基本思想:在有序数组中,取中间数值和
target
进行比较,若target
与该中间值相等,则查找成功;若target
小于该中间值,则在中间值的左半区进行查找;若target
大于该中间值,则在中间值的右半区进行查找。不断重复上述过程,直到查找到target
,或者无法在数组中查找到target
(查找失败)。 - 时间复杂度: O ( l o g n ) O(logn) O(logn)
示意图
Java实现代码
法一:循环实现
public static int binarySearch(int[] a, int target) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
int midVal = a[mid];
if (target < midVal)
high = mid - 1;
else if (target > midVal)
low = mid + 1;
else
return mid;
}
return -1;
}
法二:递归实现
public static int binarySearch(int[] a, int target) {
return binarySearch(a, target, 0, a.length - 1);
}
private static int binarySearch(int[] a, int target, int low, int high) {
if (low > high)
return -1;
int mid = (low + high) / 2;
int midVal = a[mid];
if (target < midVal)
return binarySearch(a, target, low, mid - 1);
else if (target > midVal)
return binarySearch(a, target, mid + 1, high);
else
return mid;
}
法三:使用Arrays.binarySearch
方法
int index = Arrays.binarySearch(a, target);
需要注意的是:当无法在a
中查找到target
时,Arrays.binarySearch
方法会返回一个负值-insertPoint-1
,其中insertPoint
为target
插入到a
中的位置(也就是说,-返回值-1
是插入位置)。
验证:
public static void main(String[] args) {
int[] a = {1, 2, 3, 6, 7, 9, 14};
int target = 5;
System.out.println(Arrays.binarySearch(a, target));
}
运行结果:
insertionPoint=3
是5
应当插入到a
中的位置。