基本情報技術者 2009年 秋期 午前(科目A) 問06
問題文
クイックソートの処理方法を説明したものはどれか。
選択肢
ア:既に整列済みのデータ列の正しい位置に、データを追加する操作を繰り返していく方法である。
イ:データ中の最小値を求め、次にそれを除いた部分の中から最小値を求める。この操作を繰り返していく方法である。
ウ:適当な基準値を選び、それより小さな値のグループと大きな値のグループにデータを分割する。同様にして、グループの中で基準値を選び、それぞれのグループを分割する。この操作を繰り返していく方法である。(正解)
エ:隣り合ったデータの比較と入替えを繰り返すことによって、小さな値のデータを次第に端の方に移していく方法である。
クイックソートの処理方法を説明したものはどれか。【午前2 解説】
要点まとめ
- 結論:クイックソートは基準値(ピボット)で配列を小さいグループと大きいグループに分割し、再帰的に並べ替える分割統治法です。
- 根拠:各分割(パーティション)で要素を左右に振り分け、その後それぞれを独立にソートするため平均時間計算量は となります。
- 差がつくポイント:ピボットの選び方とパーティション手法で最悪計算量や実行時間が大きく変わるため、ランダム化や median-of-three、閾値で挿入ソートへ切替える工夫を覚えておくと有利です。
正解の理由
正解は ウ です。クイックソートは「基準値(ピボット)を選び、それより小さい群と大きい群に分割し、各群で同様に分割を繰り返す」ことで配列を整列するアルゴリズムであり、記述が選択肢ウに一致します。分割(パーティション)→再帰的ソートという分割統治の典型です。
よくある誤解
- クイックソートは常に速いと思われがちですが、最悪ケースでは になる点を誤解しやすいです。
- 安定なソートだと勘違いされることがあるが、標準実装は不安定です。
解法ステップ
- 問題文のキーワードを探す:「基準値」「分割」「同様にして…繰り返す」などの語がクイックソートを示唆します。
- 各選択肢のアルゴリズム特徴を対応づける:挿入ソート、選択ソート、クイックソート、バブルソートを照合します。
- クイックソート特有の「パーティション+再帰」を含む選択肢を選ぶ。ウが該当します。
- 補足で計算量や安定性を確認して、誤答の原因を整理します。
選択肢別の誤答解説
- ア: 既に整列済みの位置に順に挿入する操作の繰り返しは「挿入ソート(Insertion Sort)」の説明であり、クイックソートではありません。
- イ: 毎回最小値を取り出していく説明は「選択ソート(Selection Sort)」で、各ステップで最小(または最大)を選ぶ手法です。
- ウ: 基準値で分割し再帰的に処理する説明はクイックソートそのもので、正解です。
- エ: 隣接要素の比較と交換を繰り返して値を端に移す方法は「バブルソート(Bubble Sort)」の説明で、異なるアルゴリズムです。
補足コラム
- 計算量:平均 、最悪 (偏ったピボット選択時)。
- 安定性:基本実装は不安定。安定化には追加処理や別手法が必要です。
- パーティション手法:Hoare方式(効率的で交換回数が少ない)と Lomuto方式(実装が単純だが交換多め)が有名です。
- 実用的最適化:ランダムピボット、median-of-three、部分配列が小さい場合は挿入ソートへ切替える、尾再帰最適化などがあります。
- 実装例(簡易、再帰的):
def quicksort(a, lo=0, hi=None):
if hi is None:
hi = len(a) - 1
if lo < hi:
p = partition(a, lo, hi)
quicksort(a, lo, p-1)
quicksort(a, p+1, hi)
def partition(a, lo, hi):
pivot = a[hi] # Lomuto
i = lo
for j in range(lo, hi):
if a[j] < pivot:
a[i], a[j] = a[j], a[i]
i += 1
a[i], a[hi] = a[hi], a[i]
return i
FAQ
Q: クイックソートは常に挿入ソートやマージソートより速いですか?
A: いいえ。平均では競争力がありますが、最悪ケースや安定性が必要な場合はマージソートなどが有利です。実装とデータ特性で選びます。
A: いいえ。平均では競争力がありますが、最悪ケースや安定性が必要な場合はマージソートなどが有利です。実装とデータ特性で選びます。
Q: ピボットはどう選べばよいですか?
A: ランダム選択や median-of-three(先頭・中間・末尾の中央値)を使うと偏りを減らせ、最悪ケースを回避しやすくなります。
A: ランダム選択や median-of-three(先頭・中間・末尾の中央値)を使うと偏りを減らせ、最悪ケースを回避しやすくなります。
Q: クイックソートは安定にできますか?
A: 可能ですが追加メモリや工夫が必要です。典型実装は不安定なので、安定性が必須なら別のアルゴリズムを検討します。
A: 可能ですが追加メモリや工夫が必要です。典型実装は不安定なので、安定性が必須なら別のアルゴリズムを検討します。
関連キーワード: クイックソート、分割統治法、パーティション、ピボット、Hoare、Lomuto、平均計算量、最悪計算量、不安定ソート、挿入ソート、選択ソート、バブルソート、中央値選択、ランダム化、尾再帰最適化

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

