ITパスポート 2026年 問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,2,3,4,5
イ:1,2,3,5,4(正解)
ウ:4,5,3,2,1
エ:5,4,3,2,1
🔒 解説は解答すると表示されます
配列の並べ替え(選択ソート)の途中出力【ITパスポート 解説】
正解の理由
与えられた手続は「選択ソート(selection sort:未整列部分から最小値を選んで先頭に移すソート)」です。配列は要素番号が1から始まる1-basedで、処理は workArray を操作します。j=3 のとき、3番目以降(3〜5)の中で最小値は既に3番目にあるため位置が変わりません。したがって、jの値が3と出力された直後の workArray の全要素は 1,2,3,5,4 となり、選択肢の中では イ が正しいです。
解法ステップ
初期配列(workArray)を1番から順に書くと次のようになります。
- 初期: [1]=3, [2]=5, [3]=1, [4]=2, [5]=4
ループごとにどのように変わるか順に追います。
-
j = 1
- j〜末尾の中で最小を探す:最小は位置3(値1)。
- workArray[1] と workArray[3] を入れ替え → 配列は 1,5,3,2,4
- 出力(このとき画面に出る): j=1 と 1,5,3,2,4
-
j = 2
- 2〜末尾の中で最小を探す:最小は位置4(値2)。
- workArray[2] と workArray[4] を入れ替え → 配列は 1,2,3,5,4
- 出力: j=2 と 1,2,3,5,4
-
j = 3
- 3〜末尾の中で最小を探す:候補は位置3(3)、位置4(5)、位置5(4)。最小は位置3(値3)で、minIndex は j のまま。
- workArray[3] と workArray[3] を入れ替える(実質変化なし) → 配列は 1,2,3,5,4
- 出力: j=3 と 1,2,3,5,4 ← ここが問題で求める出力
(以降 j=4 で最小を探して入れ替え、最後に全要素をもう一度出力しますが、本問は j=3 出力直後を問うています。)
選択肢別の誤答解説
-
ア: 1,2,3,4,5
誤り。これは完全にソートされた最終状態ですが、まだ j=2 のあとで位置4と5が並び替えられていないためこの時点では到達していません。 -
イ: 1,2,3,5,4
正解。上の手順どおり、j=3 時点で配列は既に 1,2,3,5,4 になっており、j=3 の出力はこの並びを示します。 -
ウ: 4,5,3,2,1
誤り。これは逆順(降順)など別の操作の結果であり、選択ソートの途中状態とは一致しません。 -
エ: 5,4,3,2,1
誤り。これも降順であり、今回の操作の途中出力にはなりません。
よくある誤解
-
「j の値は0から始まる」と思い込む
- この問題は要素番号が1から始まる(1-based)と明示されています。j の開始は1です。0-based に慣れていると位置ズレで誤答します。
-
「最小値を見つけたら直ちに入れ替える」がすべてのアルゴリズムの動作だと思う
- 選択ソートは走査が終わってから最小位置と入れ替えます。途中で入れ替えを繰り返す別の方法(例:バブルソート)と混同すると間違えます。
-
「minIndex が j と同じなら出力は変わる」と考える
- minIndex が j のときは自分自身と入れ替えるため配列は変わりません。出力は直前の状態をそのまま示します。
補足コラム
- この手続は workArray = numberArray として配列の複製を作っています。元の numberArray は変更せず、作業用配列で並べ替えを行う設計です。
- 選択ソートの時間計算量は O(n^2)(要素数 n に対してほぼ n^2/2 回の比較)で、データ量が増えると遅くなります。実務では小規模データや学習目的で使われることが多いです。
- 選択ソートは安定性(同じ値の要素の相対順序を保つ性質)が基本的には保証されない実装が多い点に注意してください。
FAQ
Q1: なぜ j=3 のときに配列が変わらないのですか?
A1: j=3 の範囲(位置3〜5)で最小の要素が既に位置3にあるため、minIndex が j と等しく、入れ替えても値は変わらないためです。
A1: j=3 の範囲(位置3〜5)で最小の要素が既に位置3にあるため、minIndex が j と等しく、入れ替えても値は変わらないためです。
Q2: 最終出力はどのようになりますか?
A2: ループが終わると配列は完全に昇順になります。本ケースの最終出力は 1,2,3,4,5 です(ただし問題は j=3 の直後の出力を問うています)。
A2: ループが終わると配列は完全に昇順になります。本ケースの最終出力は 1,2,3,4,5 です(ただし問題は j=3 の直後の出力を問うています)。
Q3: 0-based と 1-based のどちらで考えればよいですか?
A3: 問題文で「要素番号は1から始まる」と明示されているので、ここでは1-basedで考えます。問題文の表記を必ず確認してください。
A3: 問題文で「要素番号は1から始まる」と明示されているので、ここでは1-basedで考えます。問題文の表記を必ず確認してください。
関連キーワード: 選択ソート、ソートアルゴリズム、配列操作、アルゴリズムのシミュレーション、時間計算量

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

