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
相关产品推荐
相关产品推荐

