合并过程数组超出范围

时间:2017-12-01 18:24:01

标签: java sorting merge

这是我在此函数中调用的合并过程:

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)是必需的

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);