2016-11-26 2 views
0

私はこのマージソートプロシージャを実装していましたが、範囲外の例外が発生しています。なぜそれが実行されているのかわからないので、すべての配列パラメータが満たされていることを確認しましたが、問題。配列のインデックス外の例外のマージソートプロシージャJava

public class MergeSort 
    { 
    public static void main(String[] args) throws ArrayIndexOutOfBoundsException 
     { 

     int a[]={2,4,5,7,1,2,3,6}; 

     System.out.println("Unsorted Array"); 
     for(int i=0;i<a.length;i++) 
      { 
      System.out.print(a[i]+" "); 
      } 
     try{ 
     MergeSort m=new MergeSort(); 
     a=m.merge(a, 0, 3, 7); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     System.out.println("\nSorted Array"); 
     for(int i=0;i<a.length;i++) 
      { 
      System.out.print(a[i]+" "); 
      } 


     } 

    int [] merge(int a[],int p,int q,int r) 
     { 
     //int a[]={2,4,5,7,1,2,3,6}; 
     int n1=r-p+1; 
     int n2=r-q; 

     int L[]=new int[n1+1]; 
     int R[]=new int[n2+1]; 



     for(int i=0;i<n1;i++) 
     { 
      L[i]=a[i]; 
     } 
     q=q+1; 
     for(int i=0;i<n2-1;i++) 
     { 
      R[i]=a[q+i]; 
     } 

     //L[n1+1]=9; 
     ///R[n2+1]=9; 

     int i=0,j=0; 

     for(int k=0;k<r;k++) 
     { 
      if(L[i]<=R[j]) 
      { 
       a[k]=L[i]; 
       i++; 
      } 
      else 
      { 
       a[k]=R[j]; 
       j++; 
      } 
     } 




     return a; 
     } 
    } 
Unsorted Array 
2 4 5 7 1 2 3 6 java.lang.ArrayIndexOutOfBoundsException: 5 
    at scom.id.MergeSort.merge(MergeSort.java:63) 
    at scom.id.MergeSort.main(MergeSort.java:20) 

Sorted Array 
1 2 2 3 0 0 3 6 
+0

正確なエラーメッセージは何ですかそしてそれを引き起こしているのは何ですか?質問を編集して完全なスタックトレースを表示してください。行番号が表示されないので、その行を教えてください。 – Andreas

+0

あなたの書式に一貫性があったら助けになります。 – byxor

+0

@JamesKPolkあなたの*個人的なコードスタイルを他の人の質問/回答に適用しないでください。 OPのコードスタイルは '{'を別々の行に置くことでした。これは完全に有効なコードスタイルです。編集を元に戻します。 – Andreas

答えて

1

私はあなたのコードを少し修正して動作させました。ここにあなたはそれを持っています:

public class MergeSort { 
    public static void main(String[] args) throws ArrayIndexOutOfBoundsException{ 

    int a[]={2,4,5,7,1,2,3,6}; 

    System.out.println("Unsorted Array"); 
    for(int i=0;i<a.length;i++){ 
     System.out.print(a[i]+" "); 
    } 
    try{ 
     MergeSort m=new MergeSort(); 
     a=m.merge(a, 0, 3, 7); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    System.out.println("\nSorted Array"); 
    for(int i=0;i<a.length;i++){ 
     System.out.print(a[i]+" "); 
    } 
    } 

    int [] merge(int a[],int p,int q,int r){ 
    //int a[]={2,4,5,7,1,2,3,6}; 
    int n1=q-p+2; 
    int n2=r-q+1; 

    int L[]=new int[n1]; 
    int R[]=new int[n2]; 

    for(int i=0;i<n1 -1;i++){ 
    L[i]=a[p+i]; 
    } 
    L[n1 -1] = Integer.MAX_VALUE; 
    //q=q+1; 
    for(int i=0;i<n2 -1;i++){ 
    R[i]=a[q+i+1]; 
    } 
    R[n2-1] = Integer.MAX_VALUE; 

    //L[n1+1]=9; 
    ///R[n2+1]=9; 

    int i=0,j=0; 

    for(int k = p; k <= r; k++){ 
     if(L[i] <= R[j]){ 
     a[k] = L[i++]; 
    }else{ 
     a[k] = R[j++]; 
    } 
    } 
    return a; 
} 
} 
+0

7が見つかりませんでした。 –

+0

申し訳ありませんが、コードを更新しました。 – user2751809

+0

ありがとうございます。 –

0

ライン51人のニーズ、それは私のため

+1

本当ですか?ソートされていない配列: '2 4 5 7 1 2 3 6'、ソートされた配列:' 1 2 2 3 0 0 3 6'。それは*あなたのために働くのですか?それは確かに私に正しい出力のように見えないので。 – Andreas

+0

元の質問はエラーがスローされた – Austin

+0

@オースチンしかし、それも同様にソートする必要があります、私は使用しているマージアルゴリズムに何か問題があります。 –

0

を動作するようになった for(int k=0;k<r-1;k++) されるように私は、ソートelement.Hereの1つのアレイ内で2つの左と右の配列をマージするためのいくつかの変更をしたあります適切に動作しているソリューション。 これは間違っていることを理解するのに役立ちます。

public class MergeSort { 
public static void main(String[] args) throws ArrayIndexOutOfBoundsException { 

    int a[] = {2, 4, 5, 7, 1, 2, 3, 6}; 
    System.out.println("Unsorted Array"); 
    for (int i = 0; i < a.length; i++) { 
     System.out.print(a[i] + " "); 
    } 
    MergeSort m = new MergeSort(); 
    a = m.merge(a, 0, 3, 7); 
    System.out.println("\nSorted Array"); 
    for (int i = 0; i < a.length; i++) { 
     System.out.print(a[i] + " "); 
    } 
} 

int[] merge(int a[], int p, int q, int r) { 
    //int a[]={2,4,5,7,1,2,3,6}; 
    int n1 = q - p + 1; 
    int n2 = r - q; 

    int L[] = new int[n1]; 
    int R[] = new int[n2]; 


    for (int i = 0; i < n1; i++) { 
     L[i] = a[i]; 
    } 
    for (int i = 0; i < n2; i++) { 
     R[i] = a[q + i + 1]; 
    } 

    //L[n1+1]=9; 
    ///R[n2+1]=9; 

    int i = 0, j = 0 , k = 0; 

    while (i < n1 && j < n2) { 
     if (L[i] <= R[j]) { 
      a[k] = L[i]; 
      i++; 
     } 
     else { 
      a[k] = R[j]; 
      j++; 
     } 
     k++; 
    } 

    while (i < n1) { 
     a[k] = L[i]; 
     i++; 
     k++; 
    } 

    while (j < n2) { 
     a[k] = R[j]; 
     j++; 
     k++; 
    } 

    return a; 
    } 
} 

最初に間違っているのは、左右の配列が一時的に保持されるように割り当てられた配列サイズです。

+0

あなたのソリューションは正常に動作していますが、私のコードで何が問題になっているかが私の主な関心事です。 –

+0

最初のことは – swapnil

+0

です。1. n1サイズが間違っています。 – swapnil

関連する問題