Python实现二分查找无法获取排序列表最后一个元素索引问题
代码问题诊断
这段二分查找实现的核心问题有3个,也是末尾元素92查找失效的直接原因:
- 边界更新无偏移导致死循环:判断目标位置大于当前mid时直接赋值
low = mid,小于时直接赋值upp = mid,没有做±1的边界偏移。查找索引为5的元素92时,计算会卡在low=4、upp=5的状态,(4+5)//2的结果永远是4,循环永远无法收敛到索引5,直接卡死。 - 核心逻辑偏离二分查找设计:你提前调用
list.index()拿到了目标值的正确索引存到num变量里,后续循环只是在反复调整mid值凑出这个已知索引,完全没有实现「比较中间位置元素和目标值、动态缩小查找区间」的二分查找核心逻辑,不仅失去了二分查找的效率意义,遇到重复元素时list.index()的返回逻辑也会和二分查找的预期结果冲突。 - 变量命名存在隐患:直接用Python内置类型名
list作为自定义列表的变量名,会覆盖内置的list类,后续如果要调用list相关的内置方法会直接报错。
修正后的代码
# Python program to implement binary search nums = [54, 67, 85, 33, 92, 74] nums.sort() print(f'Given list is: {nums}') low = 0 upp = len(nums) - 1 target = int(input('Enter number: ')) res_index = -1 while low <= upp: mid = (low + upp) // 2 if nums[mid] == target: res_index = mid break elif nums[mid] < target: low = mid + 1 else: upp = mid - 1 print(f'found at {res_index} index')
修正说明
- 将覆盖内置类型的
list变量重命名为nums,消除命名隐患 - 移除提前调用
index()取索引的错误逻辑,target仅存储用户输入的待查找数值 - 循环判断条件改为
low <= upp,保证全区间元素都能被覆盖 - 边界更新时增加±1偏移,彻底解决区间无法收敛的死循环问题,首尾元素均可正常查找
- 匹配到目标值后直接跳出循环,时间复杂度为标准二分查找的O(logn)
内容的提问来源于stack exchange,提问作者gagan
相关产品推荐
相关产品推荐

