1. 概念
二分查找(Binary Search)算法,也叫折半查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。类似生活中猜字游戏,它的时间复杂度是O(logn),适用于经常查找的、但是不变的(增删)的有序列表。虽然查询效率很高,但也有一定的局限性,二分查找依赖顺序表结构,那么只能使用数组作为底层数据结构,数组按照下标随机访问数据的时间复杂度是O(1),而链表随机访问的时间复杂度是O(n),并且数据量太大和太小也不适合二分查找。
2.原理
1)找出位于数组中间的值,并存放在一个变量中mid中,并和target进行比较
2)如果target值大于mid,则把数组中间位置作为下一次计算的起点进行比较。
3)如果target值小于mid,则把数组中间位置作为下一次计算的终点进行比较。
4)如果target值等于mid,则返回数组下标
3.算法分析
时间复杂度:O(logn)
4.参考链接
https://www.jianshu.com/p/78b505a6abf4
5.测试用例
public class BinarySearchDemo {
/**
* 普通版本 参考 Arrays.binarySearch0
* @param a
*@param fromIndex
* @param toIndex
* @param target
* @return
*/
private static int binarySearch0(int[] a, int fromIndex, int toIndex, int target) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
// int mid = (low + high) >>> 1;
//这种不容易内存溢出
int mid = low + ((high - low) >> 1);
int midVal = a[mid];
if (midVal < target){
low = mid + 1;
}else if (midVal > target){
high = mid - 1;
}else{
// key found
return mid;
}
}
// key not found.
return -(low + 1);
}
/**
* 递归实现
* @param array
* @param fromIndex
* @param toIndex
* @param target
* @return
* @throws Exception
*/
public static int binarySearch(int[] array, int fromIndex, int toIndex, int target) {
if (fromIndex <= toIndex) {
int middle = (fromIndex + toIndex) >>> 1;
if (array[middle] == target) {
return middle;
} else if (array[middle] < target) {
return binarySearch(array, middle+1, toIndex, target);
} else {
return binarySearch(array, fromIndex, middle-1, target);
}
}
return -1;
}
public static void main(String[] args) {
int[] array=new int[]{2,3,4,5,6,7};
int result = binarySearch(array,0,array.length,3);
System.out.println(result);
}
}