練習 5(提出プログラム名:p1405a.c)※必須ではない
この問題は中級クラスの受講生は必須ではない(提出しなくてもよい)が,
上級クラスの受講生は必須とする.
なお,どちらのクラスであっても適切に正解すれば加点対象として扱う.
まず,このプログラム(p1405a.c)をダウンロードしなさい.
このプログラムの中では HEAP という構造体が定義されている.
この構造体は「ヒープ」というデータ構造を表しており,
そこでは SIZE 個の整数を int 配列に格納するようになっている
(SIZE はマクロで定義されており,ヒープでは配列の添字 0 を使わないため +1 してある).
詳しくは後期の「データ構造とアルゴリズム」で学ぶことになるが,
ヒープとは「データを整理しながら格納」する特別なデータ構造であるということだけは
頭に入れておいてもらいたい.
ここでは単純に以下のアルゴリズムに従って
関数 append を完成させればよいものとする.それ以外の関数は一切変更しないこと.
【関数 append】
引数 p はヒープを表す構造体のポインタであり,x はそのヒープに追加すべき整数である.
また,その時点でヒープに格納されている全データは p->data[ ] という配列に入っており,
データ数は p->count で管理されているものとする.
① p->count を +1 する(既に完成している).
② c ← p->count とする(既に完成している).
③ p->data[c] ← x とする.
④無限ループのかたちで次の(4-1)~(4-4)を繰り返す:
(4-1)c が 1 ならば break で無限ループを脱出する.
(4-2)p->data[c/2] が p->data[c] より小さい場合は break で無限ループを脱出する.
(4-3)p->data[c/2] と p->data[c] の値を入れ替える.
(4-4)c ← c/2 とする.
【参考】
ヒープとは配列を活用した特別なデータ構造である.
これは「2 分木」というデータ構造を配列でうまく表現したものとなっている.
シンプルではあるが,これを使うと常に最小値(あるいは最大値)をすぐに見つけ出せる
という特徴があり,これを活用したヒープソートというアルゴリズムが知られている.
詳しくは後期の「データ構造とアルゴリズム」に譲るが,このアルゴリズムは比較的
効率的にデータの並べ替えができるようになっている.
- 【プログラムの実行例】(その1)※赤字は実行時にキーボードから入力する内容
いくつか整数を入力してください(-1 で終了):⏎ 8 1 7 4 6 2 -1 ヒープソートの結果:⏎ 1 2 4 6 7 8 ⏎
- 【プログラムの実行例】(その2)※赤字は実行時にキーボードから入力する内容
いくつか整数を入力してください(-1 で終了):⏎ 9 8 7 6 5 -1 ヒープソートの結果:⏎ 5 6 7 8 9 ⏎
【過去にあったミス(減点となり,やり直しを命じられる)】
■ 上に示した実行例を確認せずに提出してしまっている.
■ 別の関数(main や get_min)も書き換えてしまっている.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).
第14回(Cプログラミング;3 限目の方)の練習問題は以上の5問です.
p1401a.c ~ p1405a.h を Moodle から提出してください.
※ただし,p1405a.c は必須ではないです.
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,コンパイルエラーや無限ループになるプログラムを 1 個でも提出した場合は総合評価を 0 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.