Day03 二分查找
2026-08-05 09:31:04
发布于:广东
二分查找步骤
假设表中元素是按升序排列将目标元素和查找范围的中间位置的值作比较,利用中间位置将表分成前、后两个子表
①如果目标元素==查找范围的中间值则查找成功;
②如果目标元素<查找范围的中间值 因为序列是从小到大排序的,目标元素在查找范围的中间值左边,所以我们应该往左边找,则查找范围缩小到前一子表;
③如果查找范围的中间值<目标元素 因为序列是从小到大排序的,目标元素在查找范围的中间值右边,所以我们应该往右边找,则查找范围缩小到后一子表。
一直查找x,调整范围,每次范围缩小一半。
重复以上过程,直到找到目标元素,则查找成功,或者直到子表不存在为止,此时查找不成功。
上界和下界
下界
1.得到中间元素位置mid
2.
a[mid]和目标元素x作比较
a[mid]==x:保存答案,往a[mid]左边找,更新右端点
a[mid]>x保存答案,往a[mid]左边找,更新右端点
a[mid]<x:往a[mid]右边找,更新左端点结束条件:
结束条件:直到子表不存在为止 即l>r
执行条件:子表存在即 l<=r
不知道重复操作执行多少次,但知道什么时候结束->while循环
int ans = r + 1;
while (l <= r) {
int mid=(l+c)/2;
if(a[mid]>=x){
ans=mid;//更新下界
r=mid-1;//在左半部分继续查找 小于和等于的情况合并
}else l=mid+1;//在右半部分继续查找
/*=========================*/
int ans=lower_bound(a+1,a+n+1,x)-a;//找第一个大于等于x的数
上界
1.得到中间元素位置mid
2.
a[mid]和目标元素x作比较
a[mid]==x:往a[mid]右边找,更新左端点
a[mid]>x:保存答案,往a[mid]左边找,更新右端点;
a[mid]<x往a[mid]右边找,更新左端点
结束条件:直到子表不存在为止 即l>r
执行条件:子表存在即 l<=r
不知道重复操作执行多少次,但知道什么时候结束->while循环
int ans = r + 1;
while (l <= r) {
int mid=(l+c)/2;
if(a[mid]>x){
ans=mid;//更新上界
r=mid-1;//在左半部分继续查找
}else l=mid+1;//在右半部分继续查找 大于和等于的情况合并
/*=========================*/
int ans=upper_bound(a+1,a+n+1,x)-a;//找第一个大于x的数
这里空空如也













有帮助,赞一个