针对有序的数据集合。每次都通过与区间的中间元素对比,将待查找区间缩小为原来一半,直到找到所需元素或区间缩小为0
时间复杂度O(logn)
易错点(low、high、mid指数组下标)
- 循环退出条件(low<=high)
- mid取值
mid=low+(high-low)/2
位运算优化 div 2 == shr 1 - 区间上下界更新(low=mid+1、high=mid-1)
应用场景局限性?
- 依赖顺序表结构(即数组-用于按照下标随机访问元素)
- 查找针对的是有序数据(&插入删除操作不频繁、一次排序多次查找)
- 数据量太小时与顺序遍历无异(除非数据间操作耗时)
- 数据量太大是用数组存储困难
存在重复元素
变形一:查找第一个值等于给定值的元素
if ((mid==0) || (a[mid-1]!=value)) return mid;
(当a[mid]=value时检查)
变形二:查找第一个大于等于给定值的元素
if ((mid==0) || (a[mid-1]<value)) return mid;