×
データ構造とアルゴリズム

クイックソート(Quick Sort)は、一般的に実用上最も高速とされる整列アルゴリズムです。「分割統治法(Divide and Conquer)」という、大きな問題を小さな問題に分割して解くアプローチを採用しています。処理の流れは以下の通りです。まず配列の中から「ピボット(基準値)」と呼ばれる要素を適当に1つ選びます。次に、ピボットより小さい要素を左側に、大きい要素を右側に集めるように配列を再配置します(パーティション分割)。これにより、ピボットの位置が最終的な整列位置として確定します。最後に、ピボットの左側(小さいグループ)と右側(大きいグループ)に対して、それぞれ再帰的にクイックソートを適用します。通常、配列の分割がバランス良く行われれば、時間計算量は O(N log N) となり、これは比較ベースのソートアルゴリズムの理論的限界値に近い極めて高速な性能です。しかし、ピボットの選び方が極端に悪く(例えば、すでに整列された配列に対して常に最小値や最大値をピボットに選んでしまうなど)、分割が片方に偏り続けると、最悪の場合の計算量は O(N^2) に劣化してしまいます。また、同値のデータの順序が崩れる「不安定ソート」です。

試験でのポイント

試験では、クイックソートの平均時間計算量が O(N log N) であり、最悪時間計算量が O(N^2) になる理由(ピボットの選び方による偏り)について問われます。ピボットの選定を最適化するために「配列の先頭・中央・末尾の3値の中央値を選ぶ」といった工夫(三値中値法)がなされる点も知識として重要です。また、再帰呼び出しを多用するため、プログラム上のコールスタックを多く消費し、最悪の場合にスタックオーバーフローを引き起こす可能性があるといった実装上の課題も問われることがあります。

関連する用語

分割統治法(問題を小さく切り分けてそれぞれ解決するアルゴリズム設計手法)、ピボット(クイックソートで要素を二分する際の基準値)、再帰(関数の中で自分自身を再び呼び出す処理)。