基本情報技術者試験の「科目B」で多くの受験生がつまずくのが、選択ソートの変数の動き(トレース)です!
「最小値のインデックス(minIdx)がどこを指しているかわからなくなった…」
「ループ処理の中で変数 i や j、minIdx がどう変化しているのか追えない…」
そんな悩みを持つ未経験・文系受験生のために、当サイトでは変数の値や配列の動きがひと目でわかるビジュアルシミュレーターを用意しました!
まずは実際に動かしながら、選択ソートのアルゴリズムとプログラムの連動感を体感してみましょう。
1. 【動く図解】ステップ進むボタンでトレースを擬似体験してみよう
下の「進む ➔」ボタンを押すと、実行中のコード行がハイライトされ、最小値の探索や要素の入れ替えがリアルタイムに変化します。
配列 num の変化
2. 選択ソートとは?仕組みをシンプルに理解する
選択ソート(Selection Sort)は、「未整列の範囲から一番小さい値(最小値)を選び出し、先頭と入れ替える」という操作を繰り返す整列アルゴリズムです。
手持ちのトランプのカードから最小のものを探して左端に並べていくように、未整列エリアを走査して見つけた最小値を1番左へと移動させていくのが大きな特徴です。
選択ソートの基本ルール(昇順の場合)
- 未整列の要素全体をチェックし、一番小さい値(最小値)とその位置(minIdx)を探す。
- 見つけた最小値と、未整列領域の先頭(例:
num[i])の値を「入れ替える(スワップ)」。 - 入れ替えた先頭の位置が確定し、整列済みエリアとなる。
- 残りの未整列領域に対して、1〜3の操作を繰り返す。
3. 科目Bで超頻出!「最小値のインデックス (minIdx)」の追跡
選択ソートがバブルソートと大きく異なるのは、「内側ループの中で何回も値を入れ替えるのではなく、一番小さい場所(インデックス)のメモだけを更新していく」点です。
Line 2: minIdx = i(まず未整列の先頭を仮の最小値と仮定する)Line 4: if (num[j] < num[minIdx]) minIdx = j(より小さな値を見つけたら、インデックスのメモを上書きする)Line 5-6: tmpでの入れ替え(内側ループが全て終わった後、1回だけ実際に要素を入れ替える)
試験問題(科目B)では、「minIdx = j が何回実行されたか(最小値の更新回数)」や「内側ループ終了時点での minIdx の値」を問う問題が非常によく出題されます。
シミュレーターで Line 4 がハイライトされた際、黄色のマス(最小値)がどのように更新されていくのかを目で追って、変数 minIdx の動きをマスターしましょう。
4. 試験本番(紙とペン)で選択ソートを解くコツ
紙の上でトレースする際は、バブルソート以上に「変数のメモ」を残すことが重要です。
- 未整列エリアの先頭(i)に下線を引く
- 1つずつ右に見ていき、最小値を見つけるたびに余白の「minIdx = ?」を書き換える
- 右端まで確認し終えたら、先頭(i)と 最終的な minIdx の要素を入れ替える
- 確定した数値(一番左)に「〇」をつけて、次の周(i+1)に進む
選択ソートは毎ターン入れ替えるわけではないため、「最後まで見てから最後に1度だけスワップする」というリズムを崩さないように書き写すのがコツです。
5. 選択ソートに関するよくある質問(FAQ)
Q. バブルソートと選択ソートの違い・メリットは何ですか?
A. 計算量はどちらも O(n^2) ですが、選択ソートは「値の交換回数が最大でも n-1 回と少ない」のがメリットです(バブルソートは最大で約 n^2/2 回交換)。交換のコストが高いデータ構造で有利になります。
Q. 「降順(大きい順)」にしたい場合はどこを変えればいいですか?
A. if (num[j] < num[minIdx]) の比較演算子を if (num[j] > num[maxIdx]) に変更し、最大値(maxIdx)を探して先頭と入れ替える処理にすることで降順になります。
まとめ:選択ソートは「最小値の位置メモ」を意識しよう
選択ソート攻略のポイントは、「1周(外側ループ1回)ごとに、左端から順番に確定位置が広がり、探索エリアの最小値がセットされる」という流れを理解することです。
シミュレーターで何度も「戻る」「進む」を繰り返しながら minIdx の追跡に慣れ、試験本番のトレース問題で確実に満点を狙いましょう!

コメント