C言語なら俺に聞け(入門篇) Part 30
■ このスレッドは過去ログ倉庫に格納されています
0671デフォルトの名無しさん
2008/06/22(日) 00:39:05できない。
ヒープソートとは、いったん全てのデータをヒープ構造として構成した後で、
ヒープの根つまり最大値を取り出して残りを再度ヒープ化することを繰り返すアルゴリズムである。
つまり、この例での insert() と deletemax() は一対一の関係ではなく、
deletemax() が呼ばれ始めるときには insert() は全て実行済みでなければならない。
ついでにこの例のコードを効率化するヒントを挙げておく。
insert() は、ary に追加される数 x を、ヒープの葉から始めて順次親と比較し入れ替えながら適正な位置に挿入する。
同様に、deletemax() では、ヒープの末尾にあった子 ary[n-1] を、ヒープの根から始めて順次子と比較し入れ替えていく。
ここで重要なのは、比較する値の片方は常に x または ary[n-1] だった値で、入れ替え作業中変化しないということだ。
たとえば、
tmp=ary[0];
ary[0]=ary[1];
ary[1]=tmp;
tmp=ary[1];
ary[1]=ary[2];
ary[2]=tmp;
と
tmp=ary[0];
ary[0]=ary[1];
ary[1]=ary[2];
ary[2]=tmp;
は同じ結果をもたらすが、後者の方が明らかに速い。
■ このスレッドは過去ログ倉庫に格納されています