【基本情報技術者試験・科目B】クイックソートは難しい?擬似言語で整理する

基本情報技術者試験(科目B)で登場する

クイックソート

「難しいアルゴリズム」という印象を持つ人も多いですが、

先に結論を言っておきます。

クイックソートは、難しいアルゴリズムではありません。

ただし、

一度に理解しようとすると難しく感じやすいアルゴリズムです。

この記事では、

クイックソートを 「試験中に読めること」 に焦点を当てて整理します。


クイックソートとは

クイックソートは、

配列を分割しながら並び替えていく

分割統治法の代表的なアルゴリズムです。

特徴は、

  • 一度の処理で全体を整列しない
  • 基準値(pivot)を中心に配列を分ける
  • 同じ処理を繰り返す

という点にあります。


クイックソートが「難しく感じられる理由」

多くの場合、難しさの正体は次の3点です。

  • 分割・入れ替え・再帰が同時に見える
  • 「再帰」という言葉への心理的抵抗
  • 途中経過が未完成のまま進む

しかし、

試験で必要なのは 実装力ではありません

必要なのは、

  • 今、何を基準に
  • 配列がどう分かれ
  • どの値が確定したのか

を 読み取る力です。


クイックソートの考え方(本質)

クイックソートがやっていることは、実はとても単純です。

  1. 基準値(pivot)を1つ選ぶ
  2. pivot より小さい値を左側に
  3. pivot より大きい値を右側に
  4. 左右に対して、同じ処理を繰り返す

この 「分ける」処理 がすべての土台になります。


学習用の擬似言語(概念把握)

まずは、考え方をつかむための表現です。

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では読めれば十分

クイックソートは、

「一気に理解しよう」としなければ、

決して難しいものではありません。


情報

訪問数 3 回, 今日の訪問数 3回