3つのソート法のプログラムに対し、種(seed)を「学籍番号の下5桁(Y123456の人なら23456)」にして生成した乱数データ1000個を入力し、それぞれの比較回数・交換回数を求める。なお、乱数データの生成は第5回演習課題で作成したプログラムを使う。
データの個数を変えながら3つのソート法のプログラムをそれぞれ複数回(複数の種で生成した乱数で)実行し、それぞれのデータ個数における平均実行時間を求める。
cc ssort.c -o ssort
でコンパイルすると、実行ファイル
ssort
が得られる。
random ←乱数生成プログラム
ssort ←選択ソートプログラム
sortcheck ←ソートチェックプログラム
乱数データの生成・ソート・チェックは以下のようにパイプを用いて一括処理できる。
./random | ./ssort | ./sortcheck
実際、上記は
./random > random.dat
./ssort < random.dat > sort.dat
./sortcheck < sort.dat
と等価と考えてよい。
したがって、当然、パイプ処理が正しく行えるようにするためには前のプログラムの出力を後ろのプログラムで入力できるように両者の入出力を合わせてておく必要がある(理由は上記の共通ファイルrandom.dat, sort.datについて考えればわかる)。
./random | (time ./ssort)
と実行し、種とデータ個数を入力すれば、
real 0m3.739s ←実時間
user 0m0.012s ←ユーザCPU時間
sys 0m0.004s ←システムCPU時間
というような出力がされる。
今回の計測にはユーザCPU時間(つまりプログラムの実行に使った時間)を使う。
-----------------------------------------------------------------------
#!/bin/bash
num=(0 1000 2000 3000 4000 5000 ...) #データ数
seed=(1 2 3 4 5 ...) #乱数の種
変数seed, numについての2重ループ
./random seed num | (time ./ssort)
# 以上はイメージ的に書いてある。
# 2重ループや変数の正確な記述は自分で調べてみよう
-----------------------------------------------------------------------
なお、上記ファイルを使えるようにするためにはrandomプログラムを引数が使えるように改良する必要がある。つまり、randomプログラムは./randomと実行し種(たとえば"1")とデータの個数(たとえば"1000")を入力するようなやり方ではなく、./random 1 1000で実行できるようにする必要がある。プログラムの改良のポイントはこれまでint main(void)の書き方をint main(int argc, char *argv[])に直し、引数argcとargvを使うことにある。引数argcとargvの使い方についてはWebなどで調べしよう。今回の発展課題はヒントを与えるような指導は難しいので、本やWebで調べて自力で行うものとする。
Microsoft OfficeのExcelを使うなら、その使い方をWebなどで調べよう。ちなみに、龍大情報メディアセンターにOffice365(オンライン版)/Microsoft 365 Apps(デスクトップアプリ版)を利用申請することができる。
使い方についてはYutakaのPython教室というようなわかりやすいサイトを参考にするとよい。
gnuplotの基本的な使い方については高橋先生のDocs/gnuplotを参照するとよい。より詳しい内容はWebで調べよう。
実行例
***************************
./a.out
Input the seed: 123
Input the number of data: 100
93
13
73
30
79
31
…
***************************
./a.out
Input the seed: 321
Input the number of data: 100
52
94
85
17
42
21
…
ヒント:
実行例
******************************************************************************
1. ex05-random.cを編集:
乱数の出力用のprintf文のみを残し、他のprintf文をすべて削除する
2. cc ex05-random.c -o random
3. ./random > random.dat ←乱数を生成し、生成した乱数をファイルrandom.datに保存
10 ←種入力
1000 ←データの数入力
4. ex02-ssort-1.cを編集:
ソート結果の出力用のprintf文のみを残し、他のprintf文をすべて削除する
5. cc ex02-ssort-1.c -o ssort
6. ./ssort < random.dat > sort.dat ←乱数をソートし、結果をファイルsort.datに保存
7. cc ex05-sortcheck.c -o sortcheck
8. ./sortcheck < sort.dat ←ソート結果をチェック
Sorted data in ascending order ←昇順になっていれば
Sorted data NOT in ascending order!! ←昇順になっていなければ
以上ができた後、以下のようにパイプを用いて一括で実行してみよう。
./random | ./ssort | ./sortcheck
******************************************************************************
ヒント:
int n=0;
while(scanf("%d", &a[n]) != EOF) n++;