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

为何错误实现的二分查找算法仍能正常运行?

你的代码确实存在逻辑错误,只是当前场景刚好"蒙对"了结果

首先明确:你写的int mid = (low + high);完全不符合二分查找的逻辑,这是个严重错误,但因为你的代码实际变成了反向线性扫描,所以在有序数组中查找存在的元素时,刚好能返回正确索引。

为什么看起来"正确"?

你的代码逻辑本质是这样的:

  1. 初始high是数组最后一个元素的索引,第一次计算的mid = 0 + high,直接指向当前范围的最后一个元素。
  2. 如果目标元素比mid位置的元素小,就把high减1,缩小范围到前一个元素,下一轮继续检查新范围的最后一个元素。
  3. 重复这个过程,直到high刚好等于目标元素的索引,此时mid=0+high命中目标,返回结果。
  4. 如果目标元素比mid位置的元素大,直接把low设为mid+1,此时low > high,循环终止,返回"不存在"。

换句话说,你的代码根本不是二分查找,而是从数组末尾开始,逐个往前检查元素的线性扫描,时间复杂度是O(n),和二分查找的O(logn)效率天差地别。

什么时候会暴露问题?

虽然在你测试的场景中没出错,但它完全依赖有序数组的特性,而且效率极低。比如当数组长度是10000,目标元素在索引0的位置,你的代码需要循环9999次才能找到结果,而真正的二分查找只需要14次左右。

另外,虽然不会触发数组越界(因为每次计算mid时,要么mid等于当前high(不超过数组最大索引),要么计算后直接终止循环),但逻辑上完全偏离了二分查找的设计初衷。

正确的二分查找应该怎么做?

把mid的计算改成(low + high) ~/ 2,这样每次才会取当前范围的中间位置,真正实现二分查找的分治逻辑,大幅提升查找效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:57:49