令和8年度試験問題 問67

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

〔プログラム〕
67.png

  • 1,2,3,4,5
  • 1,2,3,5,4
  • 4,5,3,2,1
  • 5,4,3,2,1
正解 問題へ
分野 :テクノロジ系
中分類:アルゴリズムとプログラミング
小分類:アルゴリズムとプログラミング
解説
設問のプログラムでは、for文の中に別のfor文が書かれています。このようなくりかえり処理の入れ子構造は、ネストループや二重ループと呼ばれます。この構造では、外側のfor文が1回実行されるたびに、内側のfor文の繰返し処理が実行されます。

プログラムの処理を追っていくと次のようになります。
  1. workArray ← {3,5,1,2,4} //workArrayの要素数 = 5
  2. jを1~4まで繰り返す:j = 1
  3. minIndex ← 1
    • kを2~5まで繰り返す
    • workArray[2] < workArray[1](= 5 < 3)は false
    • workArray[3] < workArray[1](= 1 < 3)は true
      minIndex ← 3
    • workArray[4] < workArray[3](= 2 < 1)は false
    • workArray[5] < workArray[3](= 4 < 1)は false
  4. workArray[1] と workArray[3] を入替え //{1,5,3,2,4}
  5. j と workArray を出力
    1 1,5,3,2,4
  6. jを1~4まで繰り返す:j = 2
  7. minIndex ← 2
    • kを3~5まで繰り返す
    • workArray[3] < workArray[2](= 3 < 5)は true
      minIndex ← 3
    • workArray[4] < workArray[3](= 2 < 3)は true
      minIndex ← 4
    • workArray[5] < workArray[4](= 4 < 2)は false
  8. workArray[2] と workArray[4] を入替え //{1,2,3,5,4}
  9. j と workArray を出力
    2 1,2,3,5,4
  10. jを1~4まで繰り返す:j = 3
  11. minIndex ← 3
    • kを4~5まで繰り返す
    • workArray[4] < workArray[3](= 5 < 3)は false
    • workArray[5] < workArray[3](= 4 < 3)は false
  12. workArray[3] と workArray[3] を入替え(変更なし) //{1,2,3,5,4}
  13. j と workArray を出力
    3 1,2,3,5,4
ここで、jの値3が出力されます。直後に出力される workArray の出力は、上記のとおり「1,2,3,5,4」となります。したがって「イ」が適切です。

【別解:文章的な説明】
このプログラムは、配列の未整列部分から最小値を探し、その最小値を先頭側へ移動させる処理を繰り返しています。つまり、選択ソートと同じ考え方で、配列を小さい順に並べ替えようとしています。

初期状態では、workArray は {3,5,1,2,4} です。

まず、j = 1 の処理では、1番目から5番目までの範囲で最小値を探します。最初は1番目の値3を最小値の候補としますが、3番目にある値1の方が小さいため、最小値の位置は3番目になります。その後、2や4と比較しても1より小さい値はありません。したがって、1番目の値3と3番目の値1を入れ替えます。この結果、配列は {1,5,3,2,4} になります。この段階で、先頭の1は正しい位置に確定したと考えられます。

次に、j = 2 の処理では、すでに確定した1番目を除き、2番目から5番目までの範囲で最小値を探します。最初は2番目の値5を最小値の候補とします。3番目の値3は5より小さいため、最小値の候補は3番目に変わります。さらに、4番目の値2は3より小さいため、最小値の候補は4番目に変わります。5番目の値4は2より小さくないため、最小値の位置は4番目のままです。そのため、2番目の値5と4番目の値2を入れ替えます。配列は {1,2,3,5,4} になります。この段階で、1番目と2番目の値は小さい順に確定しています。

次に、j = 3 の処理では、3番目から5番目までの範囲で最小値を探します。最初は3番目の値3を最小値の候補とします。4番目の値5は3より小さくなく、5番目の値4も3より小さくありません。そのため、最小値の位置は3番目のままです。結果として、3番目の要素と3番目の要素を入れ替えることになり、配列は変化しません。配列は {1,2,3,5,4} のままです。

出力の観点から見ると、j = 3 の処理が終わった時点で、まず j の値である3が出力されます。そして、その直後に現在の配列である 1,2,3,5,4 が出力されます。

したがって、j が3のときに出力される workArray は 1,2,3,5,4 であり、選択肢としては「イ」が適切です。

Pagetop