問67 選択ソートの途中の配列

ITパスポート 令和8年度 公開問題、全100問のうちの問67。

出典:令和8年度 ITパスポート試験 公開問題 問67(プログラムは原本の画像を文字に書き起こした)

手続 sort は,要素数が2以上の整数型の配列を引数 numberArray で受け取り,その要素を昇順に並べ替えた結果を出力する。手続 sort の動作確認のために,処理の途中で j の値と workArray の全ての要素を出力する。配列 numberArray を{3, 5, 1, 2, 4}とし,手続 sort を sort(numberArray)として呼び出したとき,j の値が3と出力された直後の workArray の全ての要素の出力はどれか。ここで,配列の要素番号は1から始まる。

プログラム
○sort(整数型の配列: numberArray)
整数型: minIndex, j, k
整数型の配列: workArray ← numberArray // 配列の複製を作る
for (j を 1 から (workArray の要素数 − 1) まで 1 ずつ増やす)
// j 番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を
// 一つ求める
minIndex ← j
for (k を (j + 1) から workArray の要素数 まで 1 ずつ増やす)
if (workArray[k] が workArray[minIndex] より小さい)
minIndex ← k
endif
endfor
workArray[j] と workArray[minIndex] の値を入れ替える
 
// 動作確認のために,j の値と workArray の全ての要素を出力する
j の値を出力する
workArray の全ての要素 を先頭から順にコンマ区切りで出力する
endfor
workArray の全ての要素 を先頭から順にコンマ区切りで出力する
  1. ア1,2,3,4,5
  2. イ1,2,3,5,4
  3. ウ4,5,3,2,1
  4. エ5,4,3,2,1
答えと解説を開く

正解はイです。

このプログラムは、j 番目から後ろでいちばん小さい値を探し、j 番目と入れ替える、を j を 1 つずつ進めながら繰り返します。{3, 5, 1, 2, 4} で順に追います。j が 1 の回は、1 番目以降の最小の 1 (3 番目) と 1 番目の 3 を入れ替え、1,5,3,2,4 になります。j が 2 の回は、2 番目以降の最小の 2 (4 番目) と 2 番目の 5 を入れ替え、1,2,3,5,4 になります。j が 3 の回は、3 番目以降 (3,5,4) の最小が 3 番目の 3 そのものなので、入れ替えても変わらず 1,2,3,5,4 です。このあと j の値 3 を出力し、続けて 1,2,3,5,4 を出力します。だから正解はイです。

ほかの選択肢が違う理由

  • ア1,2,3,4,5 は、j が 4 の回で 5 と 4 を入れ替えたあとの、並べ替えの終わった形です。j が 3 の時点ではまだ 5 と 4 が逆です。
  • ウ4,5,3,2,1 は、どの回の途中の形にもなりません。このプログラムは前から順に小さい値を確定させていきます。
  • エ5,4,3,2,1 は大きい順 (降順) の並びです。このプログラムは小さい順 (昇順) に並べます。

仕組み

このやり方を選択ソートと言います。1 回の繰返しごとに、前から 1 つずつ正しい値が確定していきます。

トレースの問題では、表を書いて、繰返しの 1 回ごとに変数と配列の中身を書き出すと、取り違えを防げます。

この問に出る言葉