2012-02-12 5 views
1

私は本の擬似コードの著者に基づいてMergeSortを実装する必要がある宿題に取り組んでいます。 (アルゴリズムの基礎、ナポリとナミポートの第4版)。Arraycopy私のプログラムをクラッシュさせよう

メインメソッドから、配列の長さをint n、ソートする配列をS []としてmergeSortを呼び出しています。 S []は既に1から999の間の乱数で埋められています。私のプログラムはマージの最後のarraycopyでクラッシュしていますが、なぜそうであるのか分からず、ネットビーンでデバッグを試みました。私はこれがおそらく私が見ることができない愚かな間違いであるように感じる。どんな助けも素晴らしいだろう。ありがとうございました。

public static void mergesort (int n, int S[]) 
    { 
     if(n>1){ 
     final int h=n/2, m=n-h; 
     int U[] = new int[h]; 
     int V[] = new int[m]; 
     System.arraycopy(S, 0, U, 0, h); 
     System.arraycopy(S, h, V, 0, m); 
     mergesort(h, U); 
     mergesort(m, V); 
     merge(h, m, U, V, S); 
     } 
    } 
    public static void merge(int h, int m, final int U[], final int V[], final int S[]) 
    { 
     int i=0, j=0, k=0; 
     while(i<h && j<m){ 
     if(U[i]<V[j]) { 
      S[k] = U[i]; 
      i++; 
     } 
     else { 
      S[k]=V[j]; 
      j++; 
     } 
     k++; 
     } 
     if(i>h) 
     System.arraycopy(V, j, S, k, h+m); 
     else 
     System.arraycopy(U, i, S, k, h+m); 
    } 

編集:私はマージでいくつかの小さな間違いがあることを知った。最大の変更点は、equalsでの作業の比較を変更し、arraycopyの長さを理解することは、コピーしたい要素の数です。ここに私のマージメソッドがあります。 mergesortは同じままでした。

public static void merge(int h, int m, final int U[], final int V[], int S[]) 
    { 
     int i=0, j=0, k=0; 
     while(i<h && j<m){ 
     if(U[i]<V[j]) { 
      S[k] = U[i]; 
      i++; 
     } 
     else { 
      S[k]=V[j]; 
      j++; 
     } 
     k++; 
     } 
     if(i>=h) 
     System.arraycopy(V, j, S, k, m-j); 
     else 
     System.arraycopy(U, i, S, k, h-i); 
    } 

ありがとうございました。

+3

stacktrace(Exception.printStacktrace())を送信します。スタックオーバーフロー、メモリ不足、インデックス外になる可能性があります。 – KarlP

+1

また、完全な解決策を提示しないように宿題にタグ付けします:)。がんばろう! –

答えて

3

テスト済みです。それはIndexOutOfBoundsとしてです。 これは、ArrayCopyで指定した長さがsource-Arrayの数よりも大きいためです。

+2

完全な解決策を投稿していないため+1! –

関連する問題