ヒープソートの実装について簡単なヘルプが得られるかどうか疑問に思っていました。私はそれを機能させ、正常にソートしていますが、出力では常に最初の番号を除いてすべてがソートされています。おそらくどこかでのチェックですが、コードを調べて値を変更しようとしましたが、必要な結果が得られませんでした。私が間違っていた場所へのアドバイスはありますか?ここに私のソースコードがあります:
code removed, problem was solved!
みんなありがとう!
private static void movedown(double [] a, int k, int c) {
while (2*k <= c-1) {
int j = 2*k+1;
if (j <= c-1 && less(a[j], a[j+1])) j++;
if (!less(a[k], a[j])) break;
exch(a, k, j);
k = j;
}
}
public static void heapsort(double [] a, int count) {
for (int k = count/2; k >= 0; k--)
movedown(a, k, count);
while (count >= 1) {
exch(a, 0, count--);
movedown(a, 0, count);
}
}
私はあなたのバグを修正し、私のマシンでテストしました。動作するはずです。これらの2つの方法のほんの2、3の小さな変更。
正しくなかったことを要約すると、次のようになります。
heapsort
メソッドでは、渡しcount
たのはゼロベースのインデックスです。ただし、ヒープを構築したときは、ループするだけでしたk = 1
。つまり、あと1回繰り返します。
メソッドでは、左の子インデックスがであり、右の子インデックスがであるmovedown
ことがわかっているはずです。2*k+1
2*k+2
インデックスの選択(つまり、0ベースと1ベース)の一貫性を保っていなかったために、バグが発生したと思います。