戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2018年 秋期 午前(科目A)06


問題文

クイックソートの処理方法を説明したものはどれか。

選択肢

既に整列済みのデータ列の正しい位置に、データを追加する操作を繰り返していく方法である。
データ中の最小値を求め、次にそれを除いた部分の中から最小値を求める。この操作を繰り返していく方法である。
適当な基準値を選び、それよりも小さな値のグループと大きな値のグループにデータを分割する。同様にして、グループの中で基準値を選び、それぞれのグループを分割する。この操作を繰り返していく方法である。(正解)
隣り合ったデータの比較と入替えを繰り返すことによって、小さな値のデータを次第に端の方に移していく方法である。

🔒 解説は解答すると表示されます

クイックソートの分割手法【午前解説】

正解の理由

選択肢は、「基準値(pivot)を選び、それより小さいグループと大きいグループに分け、各グループについて同様に処理を繰り返す」というアルゴリズムの本質を正確に表しています。これはクイックソートの代表的な説明であり、分割統治(divide and conquer)戦略に基づく整列法です。よって選択肢が正答です。

解法ステップ

  1. 文中のキーワードを確認:「基準値」「小さい値のグループと大きい値のグループに分割」「繰り返す」──これらはクイックソートの特徴。
  2. 他の選択肢と対応付け:
    • 「既に整列済みのデータ列に追加する」は挿入法(Insertion Sort)。
    • 「最小値を逐次取り出す」は選択法(Selection Sort)。
    • 「隣接要素を比較して入替え、小さいものを端に移す」はバブルソート。
  3. よって「基準値で分割して再帰的に整列する」選択肢がクイックソートに該当する。

選択肢別の誤答解説

  • ア: 挿入法(Insertion Sort)
    既に整列済みの部分列に要素を挿入して拡張していく方法。安定で小規模またはほぼ整列済みの配列に有利。アルゴリズムの分割統治的な分配・再帰は含まれない。
  • イ: 選択法(Selection Sort)
    配列から最小(または最大)を探して先頭に置き、それを除いて同様の操作を繰り返す手法。探索と交換を繰り返すため要素の移動が相対的に少ないが、一般的には安定ではない(工夫で安定化可能)。
  • : クイックソート(正解)
    ピボット選択→パーティション→再帰的整列の流れ。平均計算量は 、最悪は (ピボットが極端に偏る場合)。
  • エ: バブルソート(Bubble Sort)
    隣接要素を比較・交換して小さい要素を徐々に前に移す手法。実装は単純だが効率は低く、平均・最悪とも

よくある誤解

  1. 「クイックソートは常に不安定(安定でない)」
    → 一般に用いられるインプレースなパーティション方式(Lomuto, Hoare など)による実装は安定でないことが多いが、配列を分割して新しいリストを作る単純な再帰実装(例:less/equal/greater を使う実装)は元配列の順序を保持するため安定になります。実装の方法で安定性は変わります。
  2. 「クイックソートは必ず高速」
    → 平均では高速()ですが、ピボット選択が悪いと最悪 になります。ランダム化や中央値選択で最悪事態を避ける工夫が重要です。

補足コラム

簡易で安定なPython実装例(再帰的で新しいリストを返す版)は次の通りです。この実装は等しい要素の元の順序を保つため安定です(リスト内包表記が元配列の走査順を保つため)。ただし追加の領域を用いるためメモリ使用は増えます。
def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left  = [x for x in arr if x < pivot]
    mid   = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + mid + quicksort(right)
対して、配列上で要素を交換しながら行うインプレース版(Lomuto/Hoare パーティション)は追加領域が小さい利点がありますが、等価要素の順序が入れ替わるため一般に安定ではありません。ライブラリ実装では、性能と最悪時の保証を両立させるためにイントロソート(Quick+Heap)を採ることがあります。
複雑度のまとめ:
  • 平均計算量:
  • 最悪計算量: (偏ったピボット)
  • 追加領域: 実装次第(非インプレース版は 、インプレース版は平均 の再帰深さ)

FAQ

Q: クイックソートは安定ですか?
A: 実装による。先に示したようなリストを新しく作る再帰実装は安定です。一方で一般的なインプレースなパーティション実装は安定ではありません。
Q: ソートに使うピボットの選び方は?
A: 中央値(median of three)やランダム選択がよく使われ、偏りを避けて平均計算量に近づけるために有効です。
Q: 小さい配列ではクイックソートを使うべき?
A: 実装によりますが、実務では小さい配列に対しては挿入ソートに切り替える最適化がよく行われます(オーバーヘッドの低減)。
Q: 標準ライブラリのソートはクイックソートですか?
A: 言語によって異なります。C++ の std::sort は一般にイントロソート(Quick + Heap)を使います。安定性を重視する std::stable_sort はマージソート系です。

関連キーワード: クイックソート, 分割統治, ピボット, パーティション, 安定性, 平均計算量, Lomuto, Hoare, 三分割ソート, イントロソート
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について