二分查找算法原理(要查找的集合必须要提前排好序)
待查找数组:
8 17 19 37 40 73 79 82 87 95 97 98
0 1 2 3 4 5 6 7 8 9 10 11
输入查找值:95
时间复杂度一般考虑最坏情况:
因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4
。。。
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为
n/(2^m)=1;
2^m=n;
所以时间复杂度为:log2(n)
public class Search {
public static void main(String[] args) {
int[] array = new int[] { 8, 17, 19, 37, 40, 73, 79, 82, 87, 95, 97, 98 };
int target = 95;
// 找到了返回索引位置,找不到返回-1
int index = binarySearch(array, target);
System.out.println(index);
}
private static int binarySearch(int[] array, int target) {
int low = 0;
int high = array.length - 1;
int mid = (low + high) / 2;
while (low <= high) {
// 如果要查找的这个值在array里面有的话,那么一定会执行这个,
// 最极端的情况就是low==high相等
if (target == array[mid]) {
return mid;
}
if (target > array[mid]) {
low = mid + 1;
} else if (target < array[mid]) {
high = mid - 1;
}
mid = (low + high) / 2;
}
// 执行到这里代表在array里面没有找到元素
return -1;
}
@Test
public void testBinartSearch() {
int[] array = new int[] { 8, 17, 19, 37, 40, 73, 79, 82, 87, 95, 97, 98 };
int target = 95;
int low = 0;
int high = array.length - 1;
// 找到了返回索引位置,找不到返回-1
int index = binarySearch2(array, target, low, high);
System.out.println(index);
}
private int binarySearch2(int[] array, int target, int low, int high) {
System.out.println("low: " + low);
System.out.println("high: " + high);
// 递归退出的条件
if (low > high) {
return -1;
}
int mid = (low + high) / 2;
if (target > array[mid]) {
return binarySearch2(array, target, mid + 1, high);
} else if (target < array[mid]) {
return binarySearch2(array, target, low, mid - 1);
} else {// target == array[mid]
return mid;
}
}
}