【问题标题】:mergeSort ArrayIndexOutOfBoundsExecptionmergeSort ArrayIndexOutOfBoundsExecption
【发布时间】:2018-02-07 11:22:59
【问题描述】:

在练习合并排序时遇到问题。我在线程“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++;
        }  
    }
}

【问题讨论】:

    标签: java sorting merge indexoutofboundsexception mergesort


    【解决方案1】:

    在你的合并方法中应该是这个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 个索引。希望对您有所帮助!

    【讨论】:

    • 非常感谢!我很高兴问题如此简单
    • 大声抱歉。它在 Eclipse 上运行完美,但是 python 导师的 java 部分说它需要很长时间。我也在那里运行代码,这样我就可以看到一步一步的执行。有什么建议吗?
    猜你喜欢
    • 2020-03-25
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2017-05-17
    • 2018-02-08
    • 1970-01-01
    • 2020-07-21
    相关资源
    最近更新 更多