[ 0323: 0307の回答 ③ ]
[ 大宙乗児君の回答 ]
最後の HeapSort です。これは追加のデータ領域を必要としません。
ソースコードは以下のとおりです。
#!/usr/local/bin/perl
$N = 100; # 100 から 1000 まで変えて実行。
@data = (
# 1000 個の乱数 (整数)
);
$count = 0;
Sort(0, $N-1);
printf("Count %d\n", $count);
sub Sort() {
my $n = $N;
my $tmp;
for ($i = $n/2 - 1; $i >= 0; $i--) {
heapify($n, $i);
}
for ($i = $n - 1; $i > 0; $i--) {
$tmp = $data[0];
$data[0] = $data[$i];
$data[$i] = $tmp;
heapify($i, 0);
}
}
sub heapify($n, $i) {
my ($n, $i) = @_;
my $largest, $l, $r, $swap;
$largest = $i;
$l = 2*$i + 1;
$r = $l + 1;
$count += 2;
if (($l < $n) && ($data[$l] > $data[$largest])) {
$largest = $l;
}
$count += 2;
if (($r < $n) && ($data[$r] > $data[$largest])) {
$largest = $r;
}
$count++;
if ($largest != $i) {
$swap = $data[$i];
$data[$i] = $data[$largest];
$data[$largest] = $swap;
heapify($n, $largest);
}
}
|
大小比較演算のカウントをプロットしました。MergeSort と同様にほぼ直線ですね。
[ 南門疾矢君のコメント ]
乗児君、ありがとう。
あっという間に全部できましたね。
1000 個のデータだけでは 3 種類のアルゴリズムの性能比較にはまだ不足ですから、
あらかじめ 10000 個程度の乱数データを含むファイルを作っておいて
それを読み込んで sort をおこなう方法を試してみませんか?
正憲君もヒマだったら参加してください。
|
[ 0341: 次の記事 ]
[ 0340: 素数日プログラム ]
[ 0339: emirp 探し ]
[ 0338: 0331の解きなおし ]
[ 0337: ubuntu 20.04 へ upgrade ]
[ 0336: πの近似計算 ]
[ 0335: 0253 の振り返り ]
[ 0334: Data Camp Python ]
[ 0333: 原始ピタゴラス数をさがす ]
[ 0332: LaTex の使いかた ]
[ 0331: 青い三角形の面積 ]
[ 0330: 長方形の幅 ]
[ 0329: 三角関数の関数の最大最小 ]
[ 0328: IMO 過去問 9 ]
[ 0327: 1+2+3+...+無限 ]
[ 0326: 2分木 sort も含めた性能比較 ]
[ 0325: 最悪ケースでの sort 比較 ]
[ 0324: 0307の回答 ④ ]
[ 0323: 0307の回答 ③ ]
[ 0322: 0307の回答 ② ]
[ 0321: 0307の回答 ① ]
[ 0320: 前の記事 ]
|