java - mergeSort ArrayIndexOutOfBoundsExecption

标签 java sorting merge indexoutofboundsexception mergesort

练习合并排序时遇到问题。我在线程“main”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 个索引。希望对您有帮助!

关于java - mergeSort ArrayIndexOutOfBoundsExecption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948661/

相关文章:

java - java 小于给定数的最大素数

java - 增加 createCompoundBorder 的厚度

PHP array_column多个键相同的顺序?

javascript - 使用 for 循环对数组进行排序失败

git - 如何确定 Git 中的 cherry-pick 的提交者?

java - Spring Controller 编程风格

java - Clojure/Java 中的 Goroutine 等价物

android - 如何为 ListView 中显示的元素应用自己的排序逻辑?

Git:在 merge 分支上工作,之后未 merge

git - 将提交从一个分支移动到另一个分支