You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自行实现的二分查找算法出现死循环,错误点如何排查?

问题分析

你的代码死循环的核心原因是左边界更新逻辑错误,和循环条件无关:
你当前的区间定义是左闭右开[l, r),当判断a[m] < x时,说明m位置的元素已经明确小于目标值,不可能是最终结果,下一轮的搜索左边界应该跳过m,但你错误的把l赋值为m,就会出现区间无法收缩的死循环场景。

以你给出的测试用例a = [1, 2]、x = 2为例,死循环的触发流程:

  1. 初始l=0,r=2,进入循环,计算m=(0+2)//2=1
  2. a[1] = 2不满足a[m] < x,所以r = m = 1,此时区间为[0, 1)
  3. 循环条件r-l = 1 > 0继续执行,计算m=(0+1)//2=0
  4. a[0] = 1满足a[m] < x,你错误赋值l = m = 0,区间回到[0, 1),一直重复步骤3、4陷入死循环
修复方案

只需要修改左边界的更新逻辑,把l = m改为l = m + 1即可,同时可以补充数组越界防御逻辑,避免空数组等场景报错。
修复后的完整代码:

def binary_search(a, x):
    l = 0
    r = len(a)
    while r - l > 0:
        m = (l + r) // 2
        if a[m] < x:
            l = m + 1 # 仅修改这一行
        else:
            r = m
    # 补充边界判断,避免l超出数组下标范围报错
    return l if l < len(a) and a[l] == x else -1
修复后测试用例执行流程

还是a = [1, 2]、x = 2的场景:

  1. 初始l=0,r=2,进入循环,m=1,a[1]=2不小于x,r=1
  2. 区间[0,1)满足循环条件,m=0,a[0]=1 < 2,赋值l = 0 + 1 = 1
  3. 此时r-l=0退出循环,判断l=1 < 2且a[1]==2,返回1,结果正确

内容的提问来源于stack exchange,提问作者Mihail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:36:04