ITパスポート過去問 令和5年度(2023年)問60
手続printArrayは,配列integerArrayの要素を並べ替えて出力する。手続printArrayを呼び出したときの出力はどれか。ここで,配列の要素番号は1から始まる。

選択肢
- ア:1,2,3,4
- イ:1,3,2,4
- ウ:3,1,4,2
- エ:4,3,2,1
- ア
- イ
- ウ
- エ
正解と解き方・学習ポイント(AI解説)
図の手続printArrayは、二重ループで隣り合う要素(m番目とm+1番目)を比較し、左の値が大きい場合に交換します。この処理を繰り返すと配列は昇順に整列されるため、初期値{2,4,1,3}は{1,2,3,4}となり、その順に出力されます。
Point
この問題は、図の擬似コードから、比較している要素の位置(隣接)と交換条件(左が大きいときに交換)を読み取り、処理が昇順の整列であることと最終的な出力を判断できるかを確認するものです。
解くために必要な知識
この問題を解くには、バブルソートの動きと、疑似コードに書かれたループ範囲の読み取りが必要です。
用語の整理
| 用語 | 意味 |
|---|---|
| バブルソート | 隣り合う2要素を比較し、順序が逆なら交換する処理を繰り返して並べ替える方法です。 |
| 配列 | 複数のデータを要素番号で管理するデータ構造です。 |
| 要素番号 | 配列内の位置を示す番号です。この問題では1から始まります。 |
| 疑似コード | 特定のプログラミング言語に依存せず、処理手順を表した記述です。 |
図表の読み取り方
二重ループの意味
-
外側ループ(n)は、並べ替えの繰り返し回数を表します。
-
内側ループ(m)は、隣り合う要素同士の比較位置を左から順に動かします。
内側ループの上限が変わる理由
内側ループの上限が(要素数-n)になるため、外側ループを1回終えるごとに比較回数が1つ減ります。バブルソートでは、1回の外側ループが終わると大きい値が右端側へ移動しやすく、右端側の要素が確定していく動きになるとされます。
解くための手順
1. 初期配列と要素数を確認する
-
初期配列は{2, 4, 1, 3}です。
-
要素数は4です。
2. ループの範囲を確定する
-
nは1〜(4-1)なので1〜3です。
-
mは1〜(4-n)です。
3. 比較と交換を繰り返し、配列状態を記録する
-
条件integerArray[m] > integerArray[m+1]のときだけ交換します。
-
すべてのループ終了後の配列が出力になります。
問題の解法手順
注目点は、配列の初期値が{2, 4, 1, 3}であること、要素番号が1から始まること、そしてループ範囲が次のとおりであることです。
図表の読み取り
ループ範囲
-
外側ループnは1から(要素数-1)までです。要素数は4なので、n=1,2,3です。
-
内側ループmは1から(要素数-n)までです。
交換条件
integerArray[m] > integerArray[m+1]のときに、integerArray[m]とintegerArray[m+1]を入れ替えます。
解く手順
初期状態
{2, 4, 1, 3}
n=1(m:1〜3)
| m | 比較 | 交換 | 配列の状態 |
|---|---|---|---|
| 1 | 2 と 4 | しない | {2, 4, 1, 3} |
| 2 | 4 と 1 | する | {2, 1, 4, 3} |
| 3 | 4 と 3 | する | {2, 1, 3, 4} |
n=2(m:1〜2)
| m | 比較 | 交換 | 配列の状態 |
|---|---|---|---|
| 1 | 2 と 1 | する | {1, 2, 3, 4} |
| 2 | 2 と 3 | しない | {1, 2, 3, 4} |
n=3(m:1)
| m | 比較 | 交換 | 配列の状態 |
|---|---|---|---|
| 1 | 1 と 2 | しない | {1, 2, 3, 4} |
出力
最終的な配列は{1, 2, 3, 4}なので、出力は「1,2,3,4」です。
選択肢ごとの解説
- ア:正解
すべての比較と交換を最後まで行うと、配列は{1, 2, 3, 4}となるため正解です。
- イ:不正解
途中の状態として現れる可能性はありますが、n=1〜3まで処理を行った最終結果ではありません。
- ウ:不正解
この手順は隣接要素の比較と交換を繰り返すため、この並びは最終結果として得られません。
- エ:不正解
条件が「左が大きいとき交換」なので最終的に昇順になります。降順にはなりません。
まとめ
図の手続printArrayは、二重ループで隣り合う要素(m番目とm+1番目)を比較し、左の値が大きい場合に交換します。この処理を繰り返すと配列は昇順に整列されるため、初期値{2,4,1,3}は{1,2,3,4}となり、その順に出力されます。
テクノロジ系 > 基礎理論 > アルゴリズムとプログラミング
すべての比較と交換を最後まで行うと、配列は{1, 2, 3, 4}となるため正解です。
途中の状態として現れる可能性はありますが、n=1〜3まで処理を行った最終結果ではありません。
この手順は隣接要素の比較と交換を繰り返すため、この並びは最終結果として得られません。
条件が「左が大きいとき交換」なので最終的に昇順になります。降順にはなりません。