2017-08-29 4 views
1

mergeSortを実践する際に問題が発生しました。私はスレッド "main" java.lang.ArrayIndexOutOfBoundsException:1 で例外を受け取っています。mergeSort部分はうまくいっていますが、配列を再アセンブリするのは難しいです。どんな支援も高く評価されます。あなたのマージ方法でmergeSort ArrayIndexOutOfBoundsExecption

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++; 
     } 
    } 
} 

答えて

2

このarry1 [K] =右[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番目のインデックスにアクセスしています。それが役に立てば幸い!

+0

ありがとうございました!私は問題がとてもシンプルだったのでうれしいです – 7kevin

+0

あなたはアップホートして答えを受け入れることができます:P –

+0

lolそれについて申し訳ありません。 PythonチューターのJavaのセクションでは、それは長いがかかりますが、それはEclipseで完璧に動作します。私もそこにコードを実行するので、ステップバイステップで実行を見ることができます。助言がありますか? – 7kevin