CO-P14情報Ⅰ 対策問題

コンピュータとプログラミングプログラミング特訓 (第3問対策)

次のプログラムは、選択ソート(昇順)の一部である。空欄【ア】に入るものはどれか。 (1) Data = [5, 2, 8, 1] (2) i を 0 から 2 まで 1 ずつ増やしながら繰り返す: (3) | min_i = i (4) | j を i+1 から 3 まで 1 ずつ増やしながら繰り返す: (5) | | もし Data[j] < Data[min_i] ならば: (6) | ⎿ ⎿ min_i = 【ア】 (7) | tmp = Data[i] (8) | Data[i] = Data[min_i] (9) ⎿ Data[min_i] = tmp

解答・解説を見る

正解: 1

正答

1

この問題のポイント

選択ソートの穴埋め(最小値の位置を記録) を問う問題です。

解説

選択ソートは「未整列の部分から最小値を探し、先頭と交換する」ことを繰り返す並べ替えです。min_i は「今までに見た中で最小の値がある位置(添字)」を覚える変数で、(3)でまず先頭 i を仮の最小位置とし、(5)でより小さい値が見つかるたびに更新します。

空欄は直後の使われ方から逆算します。min_i はループ後の(8)で Data[min_i] と「添字」として使われています。つまり min_i に入れるべきは位置です。(5)の条件「Data[j] < Data[min_i]」が真になったのは「位置 j により小さい値があった」とき。だから記録すべきはその位置 j、すなわち min_i = j です。選択肢3の Data[j] は「値」なので、位置を入れるべき変数には不適切——値と添字の区別がこの問題の核心です。

i=0 の1周目をトレースします(Data=[5,2,8,1]、min_i=0)。
j=1のとき: Data[1]=2 < Data[0]=5 → 真 → min_i=1。
j=2のとき: Data[2]=8 < Data[1]=2 → 偽 → min_i=1のまま。
j=3のとき: Data[3]=1 < Data[1]=2 → 真 → min_i=3。
(7)〜(9)で Data[0] と Data[3] を交換(tmpイディオム)し、[1, 2, 8, 5] になります。最小値の1が先頭に確定しました。

共通テストでは、ソートのプログラムの空欄が「値か添字か」「iかjか」の形で問われるのが定番です。「この変数は最後にどう使われるか(添字として使われるなら位置を入れる)」と、使われ方から逆算する読み方を身につけましょう。

選択肢の確認

1.○ より小さい値が見つかった位置 j を記録する。
2.× i のままでは(3)の初期値と同じで、更新の意味がない。
3.× Data[j] は値。位置を入れる変数に値を入れる型違い。
4.× min_i+1 に小さい値がある保証はなく、意味のない計算。

ここだけは覚えよう

min_i は「最小値の位置」— 記録するのは値でなく添字 j — 変数の使われ方(添字か値か)から空欄を逆算する。

関連問題

CO-P13CO-P15