首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mergeSort ArrayIndexOutOfBoundsExecption

mergeSort ArrayIndexOutOfBoundsExecption
EN

Stack Overflow用户
提问于 2017-08-30 05:35:45
回答 1查看 113关注 0票数 1

在实践mergeSort时遇到问题。我在线程"main“java.lang.ArrayIndexOutOfBoundsException中收到异常:1 mergeSort部分工作正常,但重组数组对我来说很困难。任何帮助都将不胜感激。

代码语言:javascript
复制
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++;
        }  
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-08-30 05:39:12

在merge方法中应该是这个arry1k = rightj;

代码语言:javascript
复制
 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个索引。希望它能帮上忙!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45948661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档