私は本の擬似コードの著者に基づいて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);
}
ありがとうございました。
stacktrace(Exception.printStacktrace())を送信します。スタックオーバーフロー、メモリ不足、インデックス外になる可能性があります。 – KarlP
また、完全な解決策を提示しないように宿題にタグ付けします:)。がんばろう! –