Math Battle [ 0323: 0307の回答 ③ ]

[ 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: 前の記事 ]

[ トップページへ ]