点击上方蓝字关注我们
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
使用二分查找有两个必须满足条件:
-
必须采用顺序存储结构。
-
必须按关键字大小有序排列。
图解二分查找算法
下面我们结合图例解析二分查找的执行流程,在顺序排列的序列中寻找目标值79:
-
初始化序列:[3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82]
-
第1次查找:min=0,max=10,mid=(0+10)/2=5,此时a[mid] < 目标值。因此,设置min=mid,校准mid=(min+max)/2=8
-
第2次查找:min=5,max=10,mid=8,此时a[mid] < 目标值。因此,设置min=mid,校准mid=(min+max)/2=9
-
第3次查找,此时a[mid] = 目标值,二分查找结束。
算法实现
算法实现如下代码块:
public class BinarySearch {
public static void main(String[] args) {
int[] array= new int[]{3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};
int index = binarySearch(array, 0, array.length-1, 79);
System.out.println("findout target index = " + index);
}
/**
* 二分查找算法(返回该值第一次出现的位置)
* @param nums 查询数组
* @param start 开始下标
* @param end 结束下标
* @param findValue 要查找的值
* @return int
*/
private static int binarySearch(int[] nums, int start, int end, int findValue) {
if (start <= end) {
// 中间位置
int middle = (start + end) / 2;
// 中间的值
int middleValue = nums[middle];
System.out.println("middle="+middle);
if (findValue == middleValue) {
// 等于中值直接返回
return middle;
} else if (findValue < middleValue) {
// 小于中值,在中值之前的数据中查找
return binarySearch(nums, start, middle - 1, findValue);
} else {
// 大于中值,在中值之后的数据中查找
return binarySearch(nums, middle + 1, end, findValue);
}
}
return -1;
}
}
输出结果:
middle=5
middle=8
middle=9
findout target index = 9
算法复杂度计算
时间复杂度:因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:循环递归的次数是log2(n),即查询次数m=log2(n),所以时间复杂度为:log2(n),对数级。
空间复杂度:因为查询过程中,仅仅声明了局部变量存储头指针、尾指针和中间指针,所以空间复杂度是常数级,即O(1)。
—END—
扫描二维码
获取技术干货
后台技术汇
点个“在看”表示朕
已阅