ヒープソートを勉強していて、どうもピンとこず、とりあえず自分で作ってみようと思い立ってみたのですが...なにがいけないのでしょうか。よろしくお願いします。
結果
11 45 24 18 23 12 34
以下ソースコード
#include <stdio.h> #define N 7 // iの子の値の小さい方を返す int min(int array[], int i){ int i1 = 2*i+1, i2 = 2*i+2; if(array[i1] > array[i2]) return i2; else return i1; } // 入れ替え void swap(int array[], int i, int j){ int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } // 反順序性の回復/確保 void pushdown(int array[], int first, int last){ int i = first; while(i <= (last-1)/2){ int j = min(array, i); // iの子の値の小さい方 if(array[j] < array[i]){ // 子 < 親 swap(array, i, j); // 親iとjの内容を変換 i = j; // さらに子孫を調べる } else { return; // 逆転はないので終了 } } } // ヒープソート void heapSort(int array[]){ int i; // 配列arrayをヒープとみなす // 反順序性を確立し、arrayを完全なヒープに変換する for(i = N/2 -1; i >= 0; i--){ pushdown(array, i, N-1); } // ヒープから最小値を順次取り出し、arrayの後ろへ並べていく for(i = N-1; i >= 1; i--){ swap(array, 0, i); // ヒープの先頭から最小値を取り除く pushdown(array, 0, i-1); // 反順序性を回復する } // 最終的に大きい順に並んだ配列arrayが得られる } // 出力 void showdata(int array[]){ int i; for(i = 0; i < N; i++){ printf("%d ", array[i]); } printf("\n"); } int main(){ int array[N] = {12, 23, 24, 45, 18, 11, 34}; heapSort(array); showdata(array); return 0; }
途中結果
swap(0, 6) 34 18 12 45 23 24 11 pushdown(0, 5) 12 18 34 45 23 24 11 12 18 34 45 23 24 11 12 18 11 45 23 24 34 12 18 11 45 23 24 34
この結果を見た感じ、せっかく最後尾に持って行った11が前array[2]にきている。
pushdownの中で子の小さい方を選んでいるので、親34と子(24, 11)だと11が選ばれswap34<->11されているみたいです…
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/22 19:20
2019/05/23 01:01
2019/05/23 04:39
2019/05/23 04:42
2019/05/23 04:43
2019/05/23 05:03
2019/05/23 06:35