【问题标题】:Merge procedure array out of bounds [duplicate]合并过程数组越界[重复]
【发布时间】:2017-12-01 18:24:01
【问题描述】:

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

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

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:8

即越界 r

任何人都可以看到错误吗? - 快把我逼疯了……

解决方案更新 需要确保最初使用正确的参数调用 mergeSort 方法。这在原始教科书算法中没有指定-谢谢PW教授!非常彻底的工作!

正如评论者所建议的那样 需要调用 mergeSort(int[], 0, length-1)

【问题讨论】:

    标签: java sorting merge


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 2017-03-22
      • 2021-12-30
      • 1970-01-01
      • 2021-06-16
      • 2015-06-28
      • 2014-12-05
      • 2021-10-10
      • 2016-11-21
      相关资源
      最近更新 更多