二分查找
简介
二分查找, 也叫折半查找, 是一种简单的快速查找算法
二分查找针对的是一个有序的数据集合, 查找思想类似分治, 每次都通过跟区间的中间元素对比, 将待查找的区间缩小为之前的一半, 直到找到要查找的元素, 或者区间被缩小为0
时间复杂度O(logn), 对数时间复杂度
代码实现
二分查找的递归与非递归实现
最简单的情况是有序数组中不存在重复元素
循环实现 (todo)
递归实现 (todo)
容易出错的三个地方
- 循环退出条件, low<=high
- min的取值, low和high比较大的话, 相加可能会溢出
- low和high的更新, low=mid或high=mid可能会死循环
局限性
- 依赖顺序表结构, 既数组, 因为依赖按下标随机访问元素
- 针对有序数据, 如果无序需要先排序, 如果插入删除操作频繁, 则需频繁排序, 所以不适用二分查找
- 数据量适中, 数据量太小直接用遍历更为方便, 数据量太大时, 因为需要存储在数组, 需要连续内存空间, 内存可能放不下
进阶版
- 查找第一个值等于给定值的元素 (todo)
- 查找最后一个值等于给定值的元素 (todo)
- 查找第一个大于等于个定制的元素 (todo)
- 查找最后一个小于等于给定值的元素 (todo)
总结
等值查找使用散列表或者二叉查找树更多, 二分查找更适合用在近似查找问题
课后练习
求一个数的平方根, 精确到小数点后6位 (todo)
一个循环有序数组[4,5,6,1,2,3]中查找某个值 (todo)