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

binary search(二分查找)不返回值且程序无限运行问题咨询

问题定位

你的二分查找代码出现死循环、返回结果异常的核心原因是中点索引计算逻辑错误:
你当前写的中点计算公式是:
midpoint = (low-high)//2
这行代码写反了加减号,正确的中点计算应该是(low + high) // 2。

错误原理说明

以你测试的用例为例,初始low=0、high=7,按你的错误公式算出来的midpoint是(0-7)//2 = -4,对应列表的负索引值。后续判断如果该位置值小于目标值,你会把low设置为midpoint +1 = -3,这时候low <= high的条件依然成立,下一轮计算出来的midpoint会变成(-3-7)//2 = -5,low会继续变小,永远不会触发循环终止条件,自然就陷入死循环了。

修复后的完整代码
def binary_search(li,key):
    # 避免修改原输入列表,先复制再排序
    sorted_li = li.copy()
    sorted_li.sort()
    low = 0
    high = len(sorted_li)-1
    while low <= high:
        # 修复中点计算公式
        midpoint = (low + high)//2
        # 也可以用 low + (high - low) // 2 的写法,兼容其他有整数溢出问题的语言
        if sorted_li[midpoint] == key:
            print('key found')
            return midpoint
        elif sorted_li[midpoint] < key:
            low = midpoint + 1
        else:
            high = midpoint -1
    return -1

li = [1,2, 3, 4, 5, 6 , 7, 8]
print(binary_search(li, 7))
其他注意事项
  • 原代码里直接调用li.sort()会修改外部传入的原列表,如果你不需要改动原列表,建议像上面的修复代码一样先复制再排序
  • 如果你传入的列表本身已经是有序的,可以去掉排序步骤,减少不必要的性能消耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 16:48:02