本文へスキップ

令和8年度 ITパスポート試験 問67

この問題の解説と、これまでの解答の記録です。

問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 の全ての要素 を先頭から順にコンマ区切りで出力する

出典 令和8年度 ITパスポート試験 問67
解説

問 67

  • 不正解ア

    「1,2,3,4,5」は完全に昇順に並んだ最終結果で、これが現れるのは j=4 の出力直後(末尾の5と4を入れ替えた後)である。j=3 の直後ではまだ末尾が「…5,4」のままなので誤り。

  • イ

    正解 本手続は選択ソートで、各 j について「j 番目から末尾までで最小の要素」を探し、その要素を j 番目と入れ替える。workArray を numberArray と同じ {3,5,1,2,4} とし、要素番号は1始まりで追う。j=1 では最小値1(3番目)を1番目と入れ替えて {1,5,3,2,4}。j=2 では残り {5,3,2,4} の最小値2(4番目)を2番目と入れ替えて {1,2,3,5,4}。j=3 では残り {3,5,4} の最小値は3で、すでに3番目にあるため自分自身と入れ替えとなり配列は {1,2,3,5,4} のまま。よって「j の値3」を出力した直後の workArray は「1,2,3,5,4」であり、イが正しい。

  • 不正解ウ

    「4,5,3,2,1」という並びは、初期状態 {3,5,1,2,4} から各段階のトレースのどの時点でも現れない。先頭から最小値を確定していく選択ソートの動作と一致しないので誤り。

  • 不正解エ

    「5,4,3,2,1」は降順に並んだ状態だが、本手続は昇順ソートであり、また処理過程のどの段階でもこの並びは生じない。降順と昇順を取り違えた誤答で誤り。

ここがポイント
  • 選択ソート: 各回 j で「j 番目から末尾までの最小要素」を求め、その要素番号 minIndex を j 番目と入れ替える。最小要素がすでに j 番目にある場合は自分自身との交換(実質変化なし)になる。
  • 擬似言語のトレースは、配列を1始まりの要素番号で1ステップずつ手で追い、各 j の交換直後の配列状態を読み取るのが要点。
用語

解答の記録