练习mergeSort时遇到问题。我在线程“主”中收到异常java.lang.ArrayIndexOutOfBoundsException:1
mergeSort部分工作得很好,但是对我来说很难重新组装数组。任何帮助将不胜感激。

public class MyMergeSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arry1 = {42, 12, 30, 77, 590, 1};
        int[] arry2 = mergeSort(arry1);
        System.out.println("Merge Sort Demo: ");
        for(int i:arry2){
          System.out.print(i);
          System.out.print(" ");
        }
      }

      static int[] mergeSort(int[] arry1) {

        int n = arry1.length;
        if(n < 2)
          return arry1;

        int mid = n / 2;
        int left[] = new int[mid];
        int right[] = new int [n - mid];
        for(int i = 0; i< mid; i++) {
          left[i] = arry1[i];
        }
        for(int i = mid; i < n; i++) {
          right[i - mid] = arry1[i];
        }
        mergeSort(left);
        mergeSort(right);
        merge(arry1, left, right);
        return(arry1);
      }

      public static void merge(int[] arry1, int left[], int right[]){
        int nL = left.length;
        int nR = right.length;
        int i = 0, j = 0, k= 0;

        while( i < nL && j < nR) {
          if(left[i] < right[j]){
            arry1[k] = left[i];
            i++;
          } else {
            arry1[k] = right[i];
            j++;
          }
          k++;
        }
        while(i < nL) {
          arry1[k] = left[i];
          i++;
          k++;
        }
        while(j < nR){
          arry1[k] = right[i];
          j++;
          k++;
        }
    }
}

最佳答案

在您的合并方法中,应为arry1 [k] = right [j];

 public static void merge(int[] arry1, int left[], int right[]){
    int nL = left.length;
    int nR = right.length;
    int i = 0, j = 0, k= 0;

    while( i < nL && j < nR) {
      if(left[i] < right[j]){
        arry1[k] = left[i];
        i++;
      } else {
        **arry1[k] = right[i];**  //  Why i it should be j
        j++;
      }
      k++;
    }
    while(i < nL) {
      arry1[k] = left[i];
      i++;
      k++;
    }
    while(j < nR){
      **arry1[k] = right[i];**   // Why i it should be j
      j++;
      k++;
    }
}


我相信j是正确的,您在增加j并对其有条件,但是访问的是第i个索引而不是第j个索引。希望能帮助到你!

10-07 18:55
查看更多