快速排序:pivot为最大元素时报ArrayIndexOutOfBounds,其余场景正常
问题根因
你编写的快速排序分区函数存在边界校验缺失问题:
- 内层的两个循环没有添加数组下标边界判定逻辑,当pivot为当前处理区间的最大元素时,
while (Arr1[i] <= pivot) i++;的判定条件始终成立,i会持续自增直到超出数组合法下标范围,访问Arr1[i]时就会抛出ArrayIndexOutOfBoundsException异常。 - 你给出的测试用例中pivot取到了数组最大值77,数组内所有元素都满足
<=77的条件,i会从初始下标一直累加至超过数组最大合法下标,最终触发越界。
修复方案
给两个内层循环添加上下标边界判定,同时冗余的pivot交换条件判断可以直接移除,修复后的完整代码如下:
public int partition(int [] Arr1, int l, int h) { int pivot = Arr1[l]; int i = l; int j = h; int temp; while (i < j) { // 新增i <= j的边界判断,避免i越界 while (i <= j && Arr1[i] <= pivot) i++; // 新增i <= j的边界判断,避免j越界 while (i <= j && Arr1[j] > pivot) j--; if(i<j) { temp = Arr1[i]; Arr1[i] = Arr1[j]; Arr1[j] = temp; } } // 外层循环退出时i >= j,直接交换pivot和j位置元素即可,无需额外判断 temp = Arr1[j]; Arr1[j] = Arr1[l]; Arr1[l] = temp; return j; }
内容的提问来源于stack exchange,提问作者Mohd Saidullah
相关产品推荐
相关产品推荐

