【基本情報技術者試験・科目B】クイックソートは難しい?擬似言語で整理する
基本情報技術者試験(科目B)で登場する
クイックソート。
「難しいアルゴリズム」という印象を持つ人も多いですが、
先に結論を言っておきます。
クイックソートは、難しいアルゴリズムではありません。
ただし、
一度に理解しようとすると難しく感じやすいアルゴリズムです。
この記事では、
クイックソートを 「試験中に読めること」 に焦点を当てて整理します。
クイックソートとは
クイックソートは、
配列を分割しながら並び替えていく
分割統治法の代表的なアルゴリズムです。
特徴は、
- 一度の処理で全体を整列しない
- 基準値(pivot)を中心に配列を分ける
- 同じ処理を繰り返す
という点にあります。
クイックソートが「難しく感じられる理由」
多くの場合、難しさの正体は次の3点です。
- 分割・入れ替え・再帰が同時に見える
- 「再帰」という言葉への心理的抵抗
- 途中経過が未完成のまま進む
しかし、
試験で必要なのは 実装力ではありません。
必要なのは、
- 今、何を基準に
- 配列がどう分かれ
- どの値が確定したのか
を 読み取る力です。
クイックソートの考え方(本質)
クイックソートがやっていることは、実はとても単純です。
- 基準値(pivot)を1つ選ぶ
- pivot より小さい値を左側に
- pivot より大きい値を右側に
- 左右に対して、同じ処理を繰り返す
この 「分ける」処理 がすべての土台になります。
学習用の擬似言語(概念把握)
まずは、考え方をつかむための表現です。
PROCEDURE QuickSort(A)
IF LENGTH(A) > 1 THEN
pivot ← A[1]
L ← pivot より小さい要素の配列
R ← pivot より大きい要素の配列
QuickSort(L)
QuickSort(R)
A ← L + pivot + R
ENDIF
ENDPROCEDURE
この擬似言語の役割
- クイックソートの 全体像 をつかむ
- 「分割 → 繰り返し」という流れを理解する
※ 本番の試験では、このような
日本語でぼかした表現は使われません。
本番の試験ではどう書かれるか
科目Bでは、必ず
for 文・while 文・if 文 を用いた
具体的な処理が示されます。
代表的な分割処理例です。
pivot ← A[1]
i ← 2
j ← N
while i <= j
while i <= N and A[i] < pivot
i ← i + 1
endwhile
while A[j] > pivot
j ← j - 1
endwhile
if i < j then
TEMP ← A[i]
A[i] ← A[j]
A[j] ← TEMP
endif
endwhile
A[1] ← A[j]
A[j] ← pivot
このコードは、
先ほどの
pivot より小さい要素を左に
pivot より大きい要素を右に
という処理を、
具体的な操作として書いているだけです。
サンプルデータで処理を追う
A ← [ 5, 2, 4, 1, 3 ]
- pivot = 5
- 分割処理終了後
[ 3, 2, 4, 1, 5 ]
この時点で、
- 5 の位置は確定
- 左側は「未整列だが条件を満たしている」
という状態になります。
科目Bでの着眼点
試験では、次のような点が問われます。
- 分割処理後、確定している要素はどれか
- 次に再帰呼び出しされる範囲はどこか
- この時点の配列はどれか
ここで重要なのは、
クイックソートは
一度の処理で完成しない
という理解です。
まとめ
- クイックソートは分割を繰り返すアルゴリズム
- 難しいのは処理そのものではなく、途中経過を受け入れること
- 科目Bでは読めれば十分
クイックソートは、
「一気に理解しよう」としなければ、
決して難しいものではありません。
情報


ディスカッション
コメント一覧
まだ、コメントがありません