1

ヒープソートの実装について簡単なヘルプが得られるかどうか疑問に思っていました。私はそれを機能させ、正常にソートしていますが、出力では常に最初の番号を除いてすべてがソートされています。おそらくどこかでのチェックですが、コードを調べて値を変更しようとしましたが、必要な結果が得られませんでした。私が間違っていた場所へのアドバイスはありますか?ここに私のソースコードがあります:

code removed, problem was solved!

みんなありがとう!

4

1 に答える 1

1
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の小さな変更。

正しくなかったことを要約すると、次のようになります。

  1. heapsortメソッドでは、渡しcountたのはゼロベースのインデックスです。ただし、ヒープを構築したときは、ループするだけでしたk = 1。つまり、あと1回繰り返します。

  2. メソッドでは、左の子インデックスがであり、右の子インデックスがであるmovedownことがわかっているはずです。2*k+12*k+2

インデックスの選択(つまり、0ベースと1ベース)の一貫性を保っていなかったために、バグが発生したと思います。

于 2012-12-05T11:46:21.260 に答える