常见 二分查找

经典问题:

在一个严格递增序列中A找到给定的数x的下标

令left,right为整个序列的下标区间,每次测试比较预查询的x与中间位置Amid的大小

1.若x == Amid 说明查找成功,返回mid

2.若x < Amid 说明x在mid的左侧,因此right = mid-1;

3.若x > Amid 说明x在mid的右侧,因此left = mid + 1;

循环的条件为left <= right

当然若A序列为递减,同理。

值得注意的是:若二分查找上界超过int类型范围的一半,并且预查询元素在序列靠后的位置,mid = (left+right)/2 很可能超过int而导致溢出。因此mid 可以写成 mid = left + (right-left)/2

进一步的问题:

若递增序列A中的元素允许重复,那么对于给定的预查询元素x,求出序列中第一个大于等于x元素的位置。

与之前的查找类似,不过在条件上有些许不同

1.若x == Amid 那么第一个大于等于x的元素的范围肯定在left,mid

2.若x > Amid 范围在mid+1,right

3.若x < Amid 范围在left,mid,这个得注意,可以举个例子3,5,8x = 4,Amid = 5,那么第一个大于等于x应该是5

该问题的循环条件是left < right 而不是left <= right,对于该问题想要返回第一个大于等于x的元素的位置,不需要判断元素x本身是否存在,因此只需left,right left==right时就会刚好夹出唯一的位置,因此条件为left <right

这里可以将数组an的输入为0,n,那么当x大于数组的所有元素0\~n-1,那么就输出n,表示没有该元素。

相关推荐
東隅已逝,桑榆非晚7 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom7 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
金銀銅鐵7 小时前
一个 Java 文件实现《孫子兵法·始計篇》中英对照阅读器
java·后端·ai编程
DevOpenClub7 小时前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
qq_406981037 小时前
c++拷贝构造函数
开发语言·c++
bro_Java6668 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法
爱喝雪碧的可乐8 小时前
MATLAB
开发语言·算法·matlab
叼烟扛炮8 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
careathers9 小时前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
文丑颜不良啊9 小时前
LeetCode2081~2100题目解析
java·leetcode