応用情報技術者 2019年 秋期 午前2 問08
問題文
分割統治を利用した整列法はどれか。
選択肢
ア:基数ソート
イ:クイックソート(正解)
ウ:選択ソート
エ:挿入ソート
🔒 解説は解答すると表示されます
分割統治による整列【午前2解説】
正解の理由
分割統治(Divide and Conquer)とは、問題を小さな部分問題に分割し、それぞれを解いて結合して全体の解を得る手法です。選択肢のうち、この手法を典型的に用いる整列法はイ(クイックソート)です。クイックソートは配列を「基準(ピボット)より小さい部分」と「大きい部分」にパーティション(分割)し、各部分を再帰的にソート(征服)して結合(特別な結合作業は不要で連結で済む)するため、分割統治の典型例に当たります。
解法ステップ
- 「分割統治」の定義を確認する:分割 → 再帰的解決 → 結合の3段階があるかを基準にする。
- 各選択肢のアルゴリズムの基本動作を思い出す:分割して再帰的に処理するか、逐次的に処理するか。
- 分割して再帰的に処理するものを選ぶ:これが分割統治を採用しているアルゴリズムである。
- それに当てはまるのがクイックソートであるため、イを選ぶ。
選択肢別の誤答解説
- ア: 基数ソート
- 基数ソートは桁ごとに安定な並べ替え(バケット化)を行う非比較ソートで、分割統治の「分割→再帰→結合」という形態ではない。入力を桁単位で処理する逐次的な手順であるため不適。
- イ: クイックソート
- パーティションで分割し、各部分を再帰的にソートするため分割統治法の代表例。これが正解である。
- ウ: 選択ソート
- 配列から順に最小(または最大)を選んで先頭に置く逐次選択型のアルゴリズムで、分割して再帰的に処理する形ではない。
- エ: 挿入ソート
- 部分列を逐次拡張してソートする逐次挿入型のアルゴリズムで、分割統治法とは異なる(小さい入力で有効だが再帰的分割は行わない)。
よくある誤解
- 「分割して結合すればそれは分割統治」→ 単に分割するだけでなく、分割後に再帰的に処理し適切に結合することが重要です。例えば基数ソートは分割的に見える工程があっても分割統治の枠組みとは異なります。
- 「高速=分割統治」→ 分割統治法は平均で高速になることが多いですが、最悪計算量が悪化する場合(クイックソートの最悪は )もあり、常に最適とは限りません。
補足コラム
- クイックソートの計算量は平均で 、最悪で (ピボット選択が悪い場合)。実装次第で in-place(追加メモリほぼ不要)で高速に動くため実用上よく使われます。
- 安定性:標準的なクイックソートは安定ではありません(同じキーの相対順序を維持しない)。安定な ソートとしてはマージソートが知られています(ただし追加領域を必要とする)。
- 実装上の工夫:ランダムピボットや三分割(Dutch national flag)パーティション、末尾再帰の最適化、小さい部分に対して挿入ソートへ切り替えるなどで実行速度/安定性/最悪ケース対策が改善されます。
参考として簡単なクイックソート実装例(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)
FAQ
Q1: クイックソートは常にマージソートより速いですか?
A1: 常にではありません。平均では非常に高速ですが、最悪ケースで になる点や安定性の有無、メモリ特性などにより用途に応じて選択します。大規模データや安定性が必要ならマージソートを検討します。
A1: 常にではありません。平均では非常に高速ですが、最悪ケースで になる点や安定性の有無、メモリ特性などにより用途に応じて選択します。大規模データや安定性が必要ならマージソートを検討します。
Q2: クイックソートは安定化できますか?
A2: 実装を工夫すれば安定にすることも可能ですが、その場合は通常のクイックソートの利点(単純な in-place 性や高速性)が損なわれることがあります。
A2: 実装を工夫すれば安定にすることも可能ですが、その場合は通常のクイックソートの利点(単純な in-place 性や高速性)が損なわれることがあります。
Q3: 分割統治の他の代表的な整列法は?
A3: マージソートが典型的な別例で、分割→再帰→マージ(結合)という明確な結合工程を持ちます。
A3: マージソートが典型的な別例で、分割→再帰→マージ(結合)という明確な結合工程を持ちます。
関連キーワード: クイックソート、分割統治法、パーティション、平均計算量、最悪計算量、安定性、マージソート、基数ソート

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

