关于ArrayIndexOutOfBoundsException

来源:1-3 实现归并过程

慕粉1326050

2021-01-08 16:28:26

ArrayIndexOutOfBoundsException。

老师,如果我把temp[i-l].compareTo(temp[j-l]<=0)作为第一步的判断条件,为什么会报出这个异常呢

​for(int k=l;k<=r;k++){
if(temp[i-l].compareTo(temp[j-l])<=0){
arr[k]=temp[i-l];i++;
}else if (i>mid){
arr[k]=temp[j-l];j++;
}else if (j>r){
arr[k]=temp[i-l];i++;
}else{
arr[k]=temp[i-l];i++;
}


写回答

1回答

liuyubobobo

2021-01-09

我们期望 i 指向 [l, mid] 之间的索引;j 指向 [mid + 1, r] 之间的索引。


我们最开始判断 i > mid 和 j > r,就是先处理 i 或者 j 不在合法范围里,怎么办,如果我们肯定了 i <= mid 并且 j <= r,才能肯定 i 和 j 在合法范围里,才能放心的调用 temp[i - l] 和 temp[j - l]。


具体,使用一个小的测试用例试试看,用单步跟踪的方式,看看对于你的逻辑,到底在哪一步抛异常了?抛异常的时候, i 和 j 的值是什么?他们合法吗?为什么会出现这种情况?


可以结合 1-5 的归并排序微观解读,来做这个实验;也可以直接设计小的测试用例测试 merge。这是学习算法非常重要的方式,进步就在这个过程中哦。


继续加油!:)

0

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2610 学习 · 1087 问题

查看课程