二分查找数组时触发ArrayIndexOutOfBoundsException问题求助
二分查找数组越界问题修复方案
错误点及修复说明
- 数组名不匹配:main方法中定义的数组是
array2,但后续赋值、排序、调用方法时误用了未定义的array,需统一数组名。 - 边界初始化错误:二分查找的
last初始值设为array.length,数组最大合法索引是array.length-1,当mid计算到array.length时,访问array[mid]必然触发越界。需将last初始值改为array.length - 1。 - 条件判断逻辑错误:将目标值比较写成了和索引
last比较(array[mid] < last),完全偏离二分查找逻辑,应改为和要查找的find比较(array[mid] < find)。 - double相等判断不严谨:直接用
==比较double值会因精度问题漏判,改用差值绝对值小于极小阈值(如1e-9)判断相等。
修正后的完整代码
import java.lang.Math; import java.util.Arrays; import java.util.Random; class Search{ public static void main(String [] args){ double [] array = new double [9999]; for(int i = 0; i < array.length; i++){ array[i] = Math.random() * 9999; } Arrays.sort(array); double target = new Random().nextDouble(9999); System.out.println(binarySearch(array, target)); } public static int binarySearch(double [] array, double find){ int first = 0; int last = array.length - 1; // 修正边界初始值 int mid = (first + last) / 2; while(first <= last){ if(array[mid] < find - 1e-9){ // 考虑精度的小于判断 first = mid + 1; } else if(Math.abs(array[mid] - find) < 1e-9){ // 精度范围内判断相等 return mid; } else { last = mid - 1; } mid = (first + last) / 2; } return -1; // 循环结束直接返回-1,无需额外判断 } }
补充说明
- 循环结束后
first > last是必然结果,无需额外判断,直接返回-1即可。 - 生成随机double值时,
Math.random() * 9999已经是double类型,无需强制转换。
内容的提问来源于stack exchange,提问作者pokemonmater940
相关产品推荐
相关产品推荐

