0
点赞
收藏
分享

微信扫一扫

一文带你读懂排序算法(六):二分查找算法


一文带你读懂排序算法(六):二分查找算法_算法


一文带你读懂排序算法(六):二分查找算法_js_02

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

使用二分查找有两个必须满足条件:

  1. 必须采用顺序存储结构。
  2. 必须按关键字大小有序排列。

一文带你读懂排序算法(六):二分查找算法_js_03

图解二分查找算法

下面我们结合图例解析二分查找的执行流程,在顺序排列的序列中寻找目标值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

一文带你读懂排序算法(六):二分查找算法_css_04

  • 第2次查找:min=5,max=10,mid=8,此时a[mid] <  目标值。因此,设置min=mid,校准mid=(min+max)/2=9
  • 第3次查找,此时a[mid] =  目标值,二分查找结束。

一文带你读懂排序算法(六):二分查找算法_css_05

一文带你读懂排序算法(六):二分查找算法_js_06

一文带你读懂排序算法(六):二分查找算法_js_03

算法实现

算法实现如下代码块:

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

一文带你读懂排序算法(六):二分查找算法_js_03

算法复杂度计算

一文带你读懂排序算法(六):二分查找算法_快速排序_09

时间复杂度:因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:循环递归的次数是log2(n),即查询次数m=log2(n),所以时间复杂度为:log2(n),对数级。

空间复杂度:因为查询过程中,仅仅声明了局部变量存储头指针、尾指针和中间指针,所以空间复杂度是常数级,即O(1)。

一文带你读懂排序算法(六):二分查找算法_快速排序_10

—END—

扫描二维码

获取技术干货

后台技术汇

一文带你读懂排序算法(六):二分查找算法_数据结构_11


举报

相关推荐

0 条评论