手続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の全ての要素 を先頭から順にコンマ区切りで出力する
正答2
解説
正解は2です。
このプログラムは選択ソートです。
j番目から末尾までで最小の値を探し、j番目の要素と入れ替えることを、jを1ずつ増やしながら繰り返します。
入れ替えの後に、jの値とworkArrayの全要素を出力します。
【計算】
初期状態のworkArrayは{3, 5, 1, 2, 4}です。
j=1のとき、1番目から5番目の最小値は3番目の1なので、minIndexは3になります。
1番目と3番目を入れ替えて{1, 5, 3, 2, 4}となり、j=1とこの配列が出力されます。
j=2のとき、2番目から5番目(5, 3, 2, 4)の最小値は4番目の2なので、minIndexは4になります。
2番目と4番目を入れ替えて{1, 2, 3, 5, 4}となり、j=2とこの配列が出力されます。
j=3のとき、3番目から5番目(3, 5, 4)の最小値は3番目の3なので、minIndexは3のままです。
3番目同士の入れ替えなので配列は変わらず、j=3と{1, 2, 3, 5, 4}が出力されます。
したがって、jの値が3と出力された直後の出力は1,2,3,5,4です。
【選択肢別解説】
1:× 1,2,3,4,5は、j=4で4番目と5番目を入れ替えた後の出力です。
j=3の時点では、まだ5と4が入れ替わっていません。
2:○ j=3の処理を終えた時点の配列は{1, 2, 3, 5, 4}なので、これが出力されます。
3:× 4,5,3,2,1は、どの時点の出力にも現れません。
このプログラムは昇順に並べ替えるので、小さい値が先頭側に集まっていきます。
4:× 5,4,3,2,1は降順に並んだ配列で、昇順に並べ替えるこのプログラムでは出力されません。
【ポイント】
選択ソートでは、j回目の処理が終わるとj番目までの要素が確定します。
入れ替えの相手が自分自身のときは、配列が変わらない点に注意しましょう。