Java二分查找代码Bug排查:目标值0索引返回异常问题
二分查找代码Bug排查与修复
这段二分查找代码在查找目标值0时无法返回正确索引(数组中0的索引为2),但其他数值查找正常,问题出在比较逻辑的错误使用:
在升序(isAsc为true)和降序的分支中,代码错误地将索引值mid与目标值target进行比较,而正确的逻辑应该是用arr[mid](索引mid对应的数组元素)和target比较。
举个实际执行的例子,当查找0时:
- 初始
start=0,end=7,计算mid=3,此时arr[mid]=3,不等于0 - 进入升序分支,代码判断
mid < target(即3 < 0),条件不成立,于是将end设为mid-1=2 - 下一轮循环
start=0,end=2,mid=1,arr[mid]=-5不等于0 - 再次进入升序分支,判断
1 < 0不成立,end设为0 - 最后一轮循环
start=0,end=0,mid=0,arr[mid]=-14不等于0 - 判断
0 < 0不成立,end设为-1,循环结束返回-1,自然找不到正确索引
修复后的代码
public class binarySearch { public static void main(String[] args) { int[] arr = {-14, -5, 0, 3, 23, 49, 74, 106}; int target = 0; int ans = answer(arr, target); System.out.println(ans); } static int answer(int[] arr, int target) { int start = 0; int end = arr.length - 1; boolean isAsc = arr[start] < arr[end]; while(start <= end) { int mid = start + (end - start) / 2; if(arr[mid] == target) { return mid; } if(isAsc) { // 修正:用数组元素与目标值比较,而非索引与目标值比较 if(arr[mid] < target) { start = mid + 1; } else { end = mid - 1; } } else { // 修正:用数组元素与目标值比较,而非索引与目标值比较 if(arr[mid] < target) { end = mid - 1; } else { start = mid + 1; } } } return -1; } }
关键修复点
- 将升序分支中的
mid < target改为arr[mid] < target - 将降序分支中的
mid < target改为arr[mid] < target
修复后再运行代码,查找目标值0时会正确返回索引2,其他数值的查找逻辑也保持正常。
内容的提问来源于stack exchange,提问作者user21113485
相关产品推荐
相关产品推荐

