練習 [11] ポインタ②(5/5)

練習 5(提出プログラム名:p1105a.c)※加点対象

この問題は中級クラスの受講生は必須ではない(提出しなくてもよい)が,
上級クラスの受講生は必須とする.
なお,どちらのクラスであっても適切に正解すれば加点対象として扱う.

まず,このプログラム(p1105a.c)をダウンロードしなさい.
そして,この中の関数 check_sort_time を編集して以下の実行例のように実行できるようにしなさい.

この関数では,以下の処理を行っている:
① 整数 n を引数として受け取り,長さ n の int 配列のメモリを確保する(以下の補足説明を参照).
② ①でメモリ確保した配列に対し,先頭から n, n-1, n-2, …, 2, 1 という整数を順に書き込む.
バブルソートのアルゴリズムに従って,その配列の内容を昇順(小さい順)に並べ替える.
④ 配列のメモリを解放する.
⑤ ③のソーティングにかかった時間を return する.

【編集すべき内容】
上記の手順のうち,①②③に該当する内容を完成させなさい.
(ダウンロードしたプログラムでは,④⑤に該当する部分は既に書いてある)
なお,n は 1 以上の整数であると仮定してプログラムを作って良い.
この問題では check_sort_time の中身のみを編集し,それ以外は変更しないこと.

【補足説明】
講義資料で説明したように,配列はポインタを使って取り扱うことができます
そして,こちらは資料では説明していませんが,配列のためのメモリ確保をプログラムの実行開始後に行うこともできます.(より高度なプログラミングではよく使います.)
具体的には,
   a = malloc(sizeof(int)*n);
または
   a = calloc(n, sizeof(int));
と書くと,長さ n の int 配列のメモリが確保され,その先頭アドレスがポインタ a へ代入されます.
もしもメモリ確保に失敗した場合は a の値が NULL という特別な値になりますが,今回はこのエラー処理は割愛します.

バブルソートは平均計算量,最悪(最大)計算量ともに O(n2) のアルゴリズムなので,
配列長の n を 2 倍にすれば処理時間は 4 倍程度かかるようになります.これを体験してもらいたいというのが本練習問題の主旨です.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
    ※実際の計算時間は各自のマシンの性能によって変わりますので,データ数は適宜変えて試しても構いません.
配列長を入力してください:20000
20000 個の整数の並べ替えに 0.54 秒かかりました
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
    ※実行例1の 2 倍のデータ数に対して,時間は約 4 倍になります.
配列長を入力してください:40000
40000 個の整数の並べ替えに 2.13 秒かかりました
  • 【プログラムの実行例】(その3)赤字は実行時にキーボードから入力する内容
    ※実行例1の 4 倍のデータ数に対して,時間は約 16 倍になります.
配列長を入力してください:80000
80000 個の整数の並べ替えに 8.63 秒かかりました

【過去にあったミス(減点となり,やり直しを命じられる)】
3 種類の実行例を確認せずに提出してしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


第11回(Cプログラミング;3 限目の方)の練習問題は以上の5問です.
p1101a.c ~ p1105a.c を Moodle から提出してください.※ただし,p1105a.c は必須ではないです.
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,コンパイルエラーや無限ループになるプログラムを 1 個でも提出した場合は総合評価を 0 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.