这是我在此函数中调用的合并过程:
public static void mergeSort(int[] a, int l, int r){
if (l <r){
int m = (int)((l+r)/2.0);
mergeSort(a, l, m);
mergeSort(a, m+1, r);
merge(a, l, m,r);
}
}
private static void merge(int[] a, int l, int m, int r){
int[] b = new int[a.length];
int h;
int i = l;
int j = m+1;
int k = l;
while( (i <= m) && (j <= r)){
if(a[i] <= a[j]){
//a[i] --> b[k]
b[k] = a[i];
i = i+1;
} else {
//a[j] --> b[k]
b[k] = a[j];
j = j+1;
}
k = k+1;
}
// Now add any remaining elements from both halves
if (i > m) {
for (h=j; h< r; h++){
b[k+h-j] = a[h];
}
} else {
//take 2nd sequence
for (h=i; h< m; h++){
b[k+h-i] = a[h];
}
}
//copy back into a
for (h= k; h< r; h++){
a[h] = b[h];
}
}
数组如下所示: 4 3 3 5 1 2 7 12
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:8
即。越过上限r
越界任何人都可以看到这个错误吗? - 让我发疯了......
解决方案更新 需要确保最初使用正确的参数调用mergeSort方法。这在原始教科书算法中没有说明 - 谢谢教授PW !!非常彻底的工作!
正如评论者所说 调用mergeSort(int [],0,length-1)是必需的
答案 0 :(得分:1)
失败的原因是您没有将正确的值传递给mergeSort方法。例如,以下调用将生成您提到的错误:
int[] a = {4, 3, 3, 5, 1, 2, 7, 12};
mergeSort(a, 0, 8);
原因是 r 的值必须为7而不是数组的长度。以下代码不会导致任何错误:
int[] a = {4, 3, 3, 5, 1, 2, 7, 12};
mergeSort(a, 0, 7);