選択ソートの途中状態|ITパスポート 令和8年 公開問題 問67
出典:令和8年 公開問題 問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 の全ての要素 を先頭から順にコンマ区切りで出力する
【プログラム】
〇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
TSUNAGARU-ADVICE
まず押さえたいこと
選択ソートは、配列の先頭から順に未整列部分から最小の要素を選び出し、前方の位置と入れ替える手続きです。配列の変化は各ループごとに起こります。
迷ったときの判断軸
ループのインデックスjが示す位置から末尾までの要素の中で最も小さい要素の場所を見つけて入れ替えることを意識すると、途中の配列状態を正確に予測できます。
次の学習につなげるために
選択ソートは動作が単純で理解しやすく、他のソートアルゴリズム(バブルソートや挿入ソート)との仕組みの違いを比較しながら習得すると効果的です。
選択ソートは配列の先頭から順に、現在の位置以降の最小値を探して交換する整列アルゴリズムです。この問題では配列numberArray={3, 5, 1, 2, 4}を昇順に並べ替えています。
手続sortのループはj=1から始まり、jごとにj番目から末尾までの最小値の位置minIndexを求め、workArray[j]とworkArray[minIndex]を交換します。j=1のとき、3~5,1,2,4の中の最小値は1(index=3)で交換後は{1,5,3,2,4}。j=2のとき、5~3,2,4の中の最小値は2(index=4)で交換後は{1,2,3,5,4}。j=3のとき、3~5,4の中の最小値は3(index=3)で交換は発生せず配列はそのまま{1,2,3,5,4}になります。
よってj=3直後のworkArrayの全要素は「1,2,3,5,4」です。
したがって、イが適切です。
❌他選択肢が誤りの理由
ア:1,2,3,4,5
⇒j=3の時点で4と5は交換されておらず、まだ4が5の後にあるため誤りです。
ウ:4,5,3,2,1
⇒初期配列もしくは入れ替え途中の配列ではなく、昇順とは程遠いため誤りです。
エ:5,4,3,2,1
⇒降順配列であり昇順に並べ替える処理途中の状態ではないため誤りです。