練習 [14] 後半の復習(5/5)

練習 5(提出プログラム名:p1405a.c)※必須ではない

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

まず,このプログラム(p1405a.c)をダウンロードしなさい.

このプログラムの中では HEAP という構造体が定義されている.
この構造体は「ヒープ」というデータ構造を表しており,
そこでは SIZE 個の整数を int 配列に格納するようになっている
SIZE はマクロで定義されており,ヒープでは配列の添字 0 を使わないため +1 してある).

詳しくは後期の「データ構造とアルゴリズム」で学ぶことになるが,
ヒープとは「データを整理しながら格納」する特別なデータ構造であるということだけは
頭に入れておいてもらいたい.

ここでは単純に以下のアルゴリズムに従って
関数 append を完成させればよいものとするそれ以外の関数は一切変更しないこと.

【関数 append
 引数 p はヒープを表す構造体のポインタであり,x はそのヒープに追加すべき整数である.
 また,その時点でヒープに格納されている全データは p->data[ ] という配列に入っており,
 データ数は p->count で管理されているものとする.

 ① p->count を +1 する(既に完成している).
 ② cp->count とする(既に完成している).
 ③ p->data[c]x とする.
 ④無限ループのかたちで次の(4-1)~(4-4)を繰り返す:
   (4-1)c1 ならば break で無限ループを脱出する.
   (4-2)p->data[c/2]p->data[c] より小さい場合は break で無限ループを脱出する.
   (4-3)p->data[c/2]p->data[c] の値を入れ替える.
   (4-4)cc/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 点とするので十分に注意すること.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.