你真的完全理解二分查找了吗

本文详细解析了二分查找算法的实现细节,并针对常见的困惑进行了深入探讨,包括边界条件的选择及中间索引的计算方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,连二分查找都不知道的同学请戳这里
那么让我们一起写个二分查找的程序吧。
现在有一个从小到大排好序的a数组,要从中查找数x。
首先可以轻松的写出:

void binary_search(int l,int r,int x){

接下来的while循环怎么写呢?while (l<r)吗?还是while (l<=r)?还是别的什么呢?然后纠结了一会儿(这就说明你并未完全理解二查)。
好,总算写好了。
然后也很简单:int mid=l+(r-l)/2;
接下来呢?if (a[mid]>x)if (a[mid]>=x)?选哪个呢?这个还稍微简单些,接下来的语句呢?r=mid?或者r=mid-1?有对r的赋值自然也得有对l的赋值,这里又出现问题了:是l=mid还是l=mid+1呢?然后又得琢磨一会儿,时间就这么消失了。
最后输出l还是r呢?这得因题而异。
这还仅仅是最基础的题目,如果在实际应用中遇上形如二分最优解+贪心验证类的题目,思考的时间会不会更长?错误率会不会更高?所以好好理解一下它吧。
另外附上二分查找的代码:

void binary_search(int l,int r,int x){
  while (l<=r) {
    mid=l+(r-l)/2;
    if (a[mid]==x) return mid;
    if (a[mid]>x) r=mid-1; else l=mid+1;
  }
  return -1;
}

细心的同学可能注意到,对于mid的赋值与常见的(l+r)/2有些不同。从数学的角度来说,这两个式子是完全等价的(不清楚的线下拿笔和纸解决)。但是对于某些实际应用,mid=(l+r)/2就可能爆掉,因为l+r可能超出了整形范围(如果你开long long我就无话可说)。
——–分—-割—-线——–
看到这里,你还觉得二分查找很水吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值