令和8年度 ITパスポート試験 公開問題 問67 解説 選択ソートのアルゴリズム
問67 手続 sort は, 要素数が2以上の整数型の配列を引数 numberArray で受け取り, その 要素を昇順に並べ替えた結果を出力する。手続 sort の動作確認のために, 処理の途 中で j の値と workArray の全ての要素を出力する。配列 numberArray を{3, 5, 1, 2, 4}とし, 手続 sort を sort(numberArray)として呼び出したとき, j の値が3と出力さ れた直後の workArray の全ての要素の出力はどれか。ここで, 配列の要素番号は1か ら始まる。 〔プログラム〕 Osort(整数型の配列: 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
解説
この問題は、アルゴリズムの代表的な手法の一つである選択ソートの仕組みを理解しているかを問うものです。トレース(手順の追跡)を確実に行うことが正解への近道です。
選択ソートのトレース手順
選択ソートは、対象範囲の中から最も小さい値を探し、それを先頭の要素と入れ替える作業を繰り返すアルゴリズムです。
今回の配列は {3, 5, 1, 2, 4} です。j は外側のループのカウンタで、どの位置に確定した値を置いていくかを指定します。
j=1 のとき:
- 1番目から5番目までの中で最小値を探します。最小値は 1 です。
- 1番目の値 3 と 1 を入れ替えます。
- 配列は {1, 5, 3, 2, 4} となります。
j=2 のとき:
- 2番目から5番目まで(5, 3, 2, 4)の中で最小値を探します。最小値は 2 です。
- 2番目の値 5 と 2 を入れ替えます。
- 配列は {1, 2, 3, 5, 4} となります。
j=3 のとき:
- 3番目から5番目まで(3, 5, 4)の中で最小値を探します。最小値は 3 です。
- 3番目の値 3 と 3 を入れ替えます(値は変わりません)。
- 配列は {1, 2, 3, 5, 4} となります。
問題文は「jの値が3と出力された直後」を求めているため、この時点での配列 {1, 2, 3, 5, 4} が答えとなります。
アルゴリズムを理解する意義
この問題で学べる選択ソートは、基本的な並び替えの手法ですが、計算量は多くなりがちです。ITパスポート試験においてこの種のアルゴリズム問題を解く重要性は、単にコードを追うだけでなく、プログラムがどのようにデータを処理しているかという「計算論的思考(コンピュテーショナル・シンキング)」を養う点にあります。
実務においては、プログラミング言語標準のライブラリ(Pythonのsort()やJavaのCollections.sort()など)を使うことがほとんどですが、それらの内部ではより効率的なアルゴリズム(クイックソートやマージソートなど)が使われています。こうした基本アルゴリズムの仕組みを知っておくことで、大量のデータを扱う際にどの手法が効率的かを見極めるための基礎体力が身につきます。
効率的な学習へのステップ
アルゴリズムは、頭の中だけで考えようとするとミスが起きやすい分野です。試験中であっても、問題用紙の空きスペースに、上記のトレースのようにステップごとの状態を書き出すのが最も確実です。プログラムの流れを追うための「小さなテストデータ」を使って、処理の要点を一つずつ確定させていく癖をつけましょう。