Java二分查找代码返回-1而非预期值4的问题排查求助
修复二分查找返回-1的问题
嘿,我来帮你搞定这个二分查找的问题!你的代码之所以返回-1找不到目标元素9,其实是几个小细节没处理好,我给你拆解一下问题,再附上修复后的完整代码:
问题分析
- 递归结果未返回:原代码中递归调用
returnIndex后没有写return,导致递归得到的正确索引无法传递到上层调用,最终还是返回初始的-1。 - 右半区间起始位置错误:当目标值大于
arr[mid]时,应该把start设为mid + 1(因为mid位置已经确认不是目标值),而不是直接赋值为mid,否则会重复检查同一位置,甚至可能陷入死循环。 - 左半区间逻辑缺失:原代码的
else分支只写了一半,没有处理目标值小于arr[mid]时的递归逻辑。 - 缺少递归终止条件:当
start > end时,说明数组中已经没有可查找的区间了,目标值不存在,应该直接返回-1,避免无效递归或数组越界。
修复后的完整代码
package com.ibm.prac; public class Main { public static void main(String[] args) { int[] arr = {1,2,5,7,9,10}; int no = 9; int index = returnIndex(arr, no, 0, arr.length - 1); System.out.println(index); // 现在会输出正确的索引4 } private static int returnIndex(int[] arr, int no, int start, int end) { // 终止条件:没有可查找的区间了,返回-1 if (start > end) { return -1; } // 计算中间索引,避免溢出的写法可以用 start + (end - start) / 2 int mid = (start + end) / 2; if (no == arr[mid]) { // 找到目标值,返回索引 return mid; } else if (no > arr[mid]) { // 目标值在右半区间,递归查找右半部分 return returnIndex(arr, no, mid + 1, end); } else { // 目标值在左半区间,递归查找左半部分 return returnIndex(arr, no, start, mid - 1); } } }
额外优化说明
我还调整了方法的参数,把mid从参数里去掉了,因为每次递归都应该重新计算中间索引,这样代码更简洁也更符合二分查找的逻辑。另外,类名改成了Main(Java规范中类名首字母大写)。
内容的提问来源于stack exchange,提问作者Budding_Talent
相关产品推荐
相关产品推荐

