2012-03-20 13 views
1

現在、mergesortアルゴリズムを擬似コードレベルからjavaの作業実装に変換しようとしています。これは私のコードmergesortアルゴリズムで問題が発生しました

public int[] merge(int a[], int b[]) { 
     int c[] = new int[a.length + b.length]; 
     int i = 0, j = 0; 
     for (int k = 0; k < c.length; k++) { 
      if (a[i] <= b[j]) { 
       c[k] = a[i++]; 
      } else { 
       c[k] = b[j++]; 
      } 
     } 
     return c; 
    } 

擬似コードの解釈は、私の知る限りでは正しいですが、それはArrayOutofBound例外を返し続けています。 どこが間違っていたのですか?あなたがいないので、これは明らかにバインドされた例外のうちを与えるだろう

public int[] merge(int a[], int b[]) { 

    int i = 0, j = 0, k = 0; 
    int m = a.length, n = b.length; 
    int[] c = new int[m + n]; 

    // Merge to the end of one of the source arrays 
    while (i < m && j < n) { 
     if (a[i] <= b[j]) { 
      c[k] = a[i]; 
      i++; 
     } else { 
      c[k] = b[j]; 
      j++; 
     } 
     k++; 
    } 

    // Determine which source array has elements remaining and 
    // append those to the result array 
    if (i < m) { 
     for (int p = i; p < m; p++) { 
      c[k] = a[p]; 
      k++; 
     } 
    } else { 
     for (int p = j; p < n; p++) { 
      c[k] = b[p]; 
      k++; 
     } 
    } 

    return c; 

} 
+3

'a [a.length-1]' <'b [0]': 'a'配列全体を実行し、' i'を 'a.length 'の中に存在しない要素と' b 'の最初の要素を比較しようとします。あなたは積極的に1つの配列の終わりをチェックし、それが起こったらもう一度実行する必要があります。 – dlev

+1

@dlevは原因については正しいですが、それはまったく端に当てはまりません。何が起こっても、もう一方の配列の前にある配列で終了し、それが起こると、もう一方の配列からの充填を完了できる必要があります。 –

+0

@MarkPeters確かに、私はそれが端の場合であることを暗示するつもりはありませんでした。私はちょうどポイントを説明するために "極端な"例を使用しようとしていました。 – dlev

答えて

0

あなたはそれを実装しようとする方法で、マージアルゴリズムは、あなたが正しい実装を見つけることができます下にあり、 aおよびbアレイの長さを記録しています。 k = a + b以降、abは常にkより小さくなります。したがって、例外。

このチェックを適用するときは、a[]またはb[]であるかどうかにかかわらず残りのアイテムをコピーして、c[]にコピーしてください。これを見る -

for(;i<a.length;i++) 
    c[k++] = a[i++]; 

for(;j<b.length;b++) 
    c[k++] = b[j++]; 
関連する問題