整列3(所要時間)

どちらが速いか

時間の測定

十進BASICには TIME という関数があります。これは深夜0時からの秒数を返すものです。整列の前に LET t0=TIME とでもして、開始の秒数を記録しておき、整列が終わったら、LET t1=TIME と求め、あとで t1-t0 を計算すれば所要時間を出すことができます。配列を用意する部分や結果を表示する部分は入れないようにして整列する時間だけを計りましょう。

プログラムの流れは次のようになります。

数を配列に準備する。
LET  t0=TIME
整列する
LET  t1=TIME
整列の結果を表示する
PRINT t1-t0;"秒"

ただしこの方法は日付の変わる0時を挟んで整列させた場合は正しい結果がでません。

乱数を使って数を準備する

10個しかないと、瞬時に整列が済みますのでどんな方法でもほとんど0秒になってしまいます。乱数を使ってたくさんの数を用意するようにしましょう。

123.2456のような数でも整列できますが、うまくいったかどうかの確認のため、int関数で整数にして1〜1000あたりまでの数が並ぶようにします。

input n でいくつ数をつくるか指定できるようにしました。

RANDOMIZE
INPUT n
DIM a(n)
FOR i=1 TO n
   LET  a(i)=INT(RND*1000)
NEXT i

DATA を READ していた部分をこれで置き換えます。

これにあわせて、整列や結果表示の部分も10になっていた部分も n にしなければなりません。9とせずに10-1としていたのは、このときのことを考えていたのです。

計ってみよう

time.txtに記入してBASIC内に提出

方式1000個2000個10000個
選択ソート x.xx xx.x xxx.x
バブルソート x.xx xx.x xxx.x

10000個にもなると、整列もかかりますが、それ以上に結果の表示に時間がかかります。プログラムが完全に動くとわかったら表示を止めるようにするとよいでしょう。たとえば、

IF n < 1000 THEN
   FOR i=1 TO n
      PRINT a(i);
   NEXT i
END IF

結果の考察

速さの評価は単純ではありません。数が少ないときは速いのですが、多くなるとだめなものとか、その逆もあります。また、元の数がばらばらだと速いけど、逆順に並んでいると極端に時間がかかるとか、だいたいそろっているときにとても速いなど、得意・不得意があります。

選択ソートとバブルソートを比べたら、次に数値の数と時間の関係を見てください。数が2倍になると、時間は何倍になるかということです。

選択ソートもバブルソートも数が2倍になると、時間は4倍、3倍になると9倍というように、x倍だとx2倍になることがわかっています。これをO(n2)などと表します。データの量が少ないうちはいいのですが、ある程度以上多くなってくると我慢できないほど遅くなってしまいます。


聖愛高等学校
http://www.seiai.ed.jp/