You need to enable JavaScript to run this app. Java实现Binary Search时程序不终止,left到10后不再递增
优惠活动
大模型
产品
解决方案
定价
更多

Java实现Binary Search时程序不终止,left到10后不再递增

死循环触发的两个核心bug

你的代码凑齐了二分查找最常见的两个新手错误,刚好触发left卡在10无法前进的死循环:

1. 中间索引的计算逻辑完全错误

你写的int mid = (right - left) / 2; 只计算了左右边界的差值,没有叠加左边界的偏移量,根本不是当前搜索区间的真实中间位置。
正确的mid计算逻辑应该是从左边界出发,跨半个区间的位置,即mid = left + (right - left) / 2。
按你现在的写法,当left动态变化时,算出的mid经常会比当前合法的left值还小——比如left走到11的时候,套公式得到的mid是9,这个位置是之前已经搜索过、被明确排除的区间,结果你又把left重新赋值为mid+1=10,相当于搜索范围永远跳不出那两三个相邻元素的局部位置。

2. 分支判断没有做逻辑互斥

你当前的代码结构里,“中间值小于目标”和“中间值大于目标”是两个完全独立的if块,没有用else连接成互斥分支。
虽然实际运行中两个判断不会同时触发,但配合上前面mid计算的偏差,右边界right从头到尾都停留在数组长度30,从来没有被正确收缩过。左边界因为mid计算的错位,在10和11之间来回拉扯,每次打印left值的时候刚好输出10,看起来就像left到10就不再前进了。

修正时只需要做两处调整就能让程序正常运行:

  • 把mid的计算改成带left偏移的写法,确保mid永远落在当前合法的搜索区间内
  • 把两个方向的比较逻辑用else if连成互斥分支,保证每次循环只会收缩搜索区间的一侧

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 04:57:03