一般用語
上級

Sortアルゴリズム Quicksort/Mergesort 1959-2026(ソートアルゴリズム)

Sorting Algorithm 1959-2026 Computer Science基礎。Bubble Sort 単純1956 (O(n²))・Insertion Sort+Selection Sort O(n²)・Quicksort C.A.R. Tony Hoare 1959 (O(n log n) average・Pivot Partitioning・分割統治)・Merge Sort John von Neumann 1945 (O(n log n) Stable・Linked List対応)・Heap Sort J.W.J. Williams 1964 (Binary Heap・O(n log n))・Shell Sort Donald Shell 1959 (Insertion改良)・Radix Sort/Bucket Sort/Counting Sort 非比較ソート O(n+k)・Tim Sort (Tim Peters 2002 Python sort+Java 7・Merge+Insertion ハイブリッド)・PDQSort Pattern-Defeating Quicksort (Rust std 2015)・IntroSort (C++ STL Microsoft・Quicksort+Heapsort+Insertion)・GNU libstdc++ std::sort+std::stable_sort・Big O Best/Average/Worst Case複雑性・Stable vs Unstable Sort・In-place vs Out-of-place・Adaptive (Tim Sort) vs Non-adaptive・¥0 標準・現代Library Tim Sort+IntroSort+PDQSort主流。

0 回閲覧
0 いいね
2026/5/1 更新
関連タグ
Quicksort Hoare 1959
Mergesort von Neumann 1945
Heapsort Williams 1964
Tim Sort Peters 2002
PDQSort Rust 2015

概要

1959年にトニー・ホアが提案したクイックソートは、平均計算量が O(n log n) でありながら、実装が極めてシンプルである点が評価され、以降多くのプログラミング言語の標準ソートに採用されてきました。
一方、ジョン・フォン・ノイマンが1945年に発表したマージソートは、安定性と O(n log n) の最悪計算量を保証するため、データの順序を保持したい場合に選択されます。
この二つのアルゴリズムは、比較ソートの代表格として、2025–2026年においても多様な実装が進化し続けています。

主な特徴・仕組み

アルゴリズム平均計算量最悪計算量メモリ使用安定性主要な特徴
クイックソートO(n log n)O(n²)O(log n)(再帰スタック)不安定パーティションで分割、再帰的にソート
マージソートO(n log n)O(n log n)O(n)安定分割・統合で二分木構造を形成
パターン破壊クイックソート(PDQSort)O(n log n)O(n log n)O(log n)不安定パターン検出で最悪ケースを回避
インテリソートO(n log n)O(n log n)O(log n)不安定クイックソート+ヒープソート+挿入ソート
ティムソートO(n log n)O(n log n)O(n)安定小さなランを挿入ソートで処理、マージで統合
  • クイックソート はパーティションを行う際に「ピボット」を選択し、ピボットより小さい要素を左側、大きい要素を右側に配置します。ピボット選択戦略(ランダム、ミッド、ハイブリッド)により最悪ケースを抑制します。
  • マージソート は再帰的に配列を半分に分割し、ソート済みのサブ配列を二つのポインタでマージします。安定性を保つために、同値要素は左側の配列から先に取り出します。
  • PDQSort は入力配列の「パターン」を事前に検出し、連続した等しい要素や既にソートされた区間を高速に処理します。
  • インテリソート はクイックソートの高速性とヒープソートの最悪計算量保証を組み合わせ、再帰深度が大きくなるとヒープソートへ切り替えます。
  • ティムソート はPython 3.12以降の sorted() や Java 17 の Arrays.sort() で採用され、実際のデータに合わせて「ラン」を自動検出し、挿入ソートとマージを組み合わせます。

具体例・対応製品 (テーブル必須)

製品名バージョンアルゴリズム平均計算量最悪計算量メモリ安定性パラレル対応発表年備考
GNU libstdc++12.3std::sortO(n log n)O(n²)O(log n)不安定なし2025低レイテンシ設計
LLVM libc++17.0std::sortO(n log n)O(n²)O(log n)不安定なし2025SIMD最適化
Rust std::sort1.70PDQSortO(n log n)O(n log n)O(log n)不安定なし2026安全性重視
Python 3.123.12sorted (TimSort)O(n log n)O(n log n)O(n)安定なし2025低メモリフットプリント
Java 1717Arrays.sort (Dual‑Pivot Quicksort)O(n log n)O(n²)O(log n)不安定なし2025低レイテンシ
NVIDIA cuSORT12.0Radix Sort (GPU)O(n log k)O(n log k)O(n)不安定あり202610×高速化
Intel MKL2026QuickSort (TBB)O(n log n)O(n²)O(log n)不安定あり2025スレッドプール最適化
OpenCL Sort1.2MergeSort (GPU)O(n log n)O(n log n)O(n)安定あり2026クロスプラットフォーム
TBB Parallel Sort2025IntrosortO(n log n)O(n log n)O(log n)不安定あり2025スケーラブル
Go sort1.20QuickSortO(n log n)O(n²)O(log n)不安定なし2025ガーベジコレクション最適化
  • メモリ は再帰スタックや一時配列の使用量を示します。
  • パラレル対応 はマルチスレッドやGPUでの並列実行が可能かどうかを示します。

選び方・注意点

  1. データサイズ

    • 10⁵以下の小規模配列ではクイックソートが最も高速。
    • 10⁶以上の大規模配列ではマージソートやヒープソートの安定性・最悪計算量保証が重要。
  2. メモリ制約

    • メモリが限られている組み込み環境ではクイックソート(O(log n) スタック)を選択。
    • 一時配列を許容できる場合はマージソート(O(n))で安定性を確保。
  3. 安定性要件

    • ソート後に元の順序を保持する必要がある場合はマージソート、ティムソート、またはGPU版のマージソートを採用。
  4. 並列処理

    • マルチコアCPUやGPUを活用する場合は TBB Parallel Sort、NVIDIA cuSORT、Intel MKL の並列実装を検討。
  5. ハードウェアアクセラレーション

    • GPUベースのデータベースやビッグデータ処理では cuSORT のような専用ライブラリが 10 倍以上高速。

関連用語との違い

  • Radix Sort / Counting Sort

    • 比較ではなく桁ごとに分割するため、O(n k)(k は桁数)で実行。
    • 文字列や整数のソートに最適だが、一般的な比較ソートと比べて安定性が保証される。
  • Heap Sort

    • O(n log n) の最悪計算量を持つが、クイックソートに比べて比較回数が多く、実行速度が遅い。
    • メモリは O(1) で済むが、安定性は持たない。
  • Shell Sort

    • 挿入ソートの改良版で、O(n log² n) まで改善されるが、最悪計算量は O(n²)。
    • 実装は簡単だが、クイックソートやマージソートに比べてパフォーマンスが劣る。
  • Tim Sort

    • マージソートと挿入ソートを組み合わせたハイブリッドで、実際のデータに合わせて最適化。
    • Python 3.12 以降の sorted() で採用され、安定性と高速性を両立。

よくある質問 (FAQ)

Q1: クイックソートは最悪ケースで O(n²) になるが、実際にはどの程度影響するか?
A1: ほとんどの実装はピボット選択にランダム化や中央値3点法を採用しており、最悪ケースは極めて稀です。実際のデータでは平均計算量 O(n log n) が観測されます。

Q2: マージソートは安定性があるが、メモリが足りない環境ではどうすればよいか?
A2: 1 次元のバッファを再利用する「外部マージソート」や「インプレースマージソート」を使用すると、O(log n) の追加メモリで安定性を保つことができます。

Q3: GPU 用のソートライブラリは CPU 版と比べてどのくらい高速になるか?
A3: NVIDIA cuSORT は 10 倍以上のスループット向上を報告しており、データサイズが 10⁶ 以上になると CPU 版よりも顕著に高速です。ただし、データ転送オーバーヘッドを考慮する必要があります。

まとめ

1959 年以降、クイックソートとマージソートはそれぞれ「高速性」と「安定性・最悪計算量保証」という二大柱を担い、ソフトウェア開発の基盤を支えてきました。2025–2026 年の最新動向では、ハードウェアアクセラレーション(GPU)やパラレル実装(TBB、Intel MKL)、そして入力データに応じてアルゴリズムを自動選択するハイブリッド(PDQSort、Introsort、TimSort)が主流となっています。
実際の選択は、データサイズ、メモリ制約、安定性要件、並列処理の有無といった要因を総合的に判断し、適切な実装を選ぶことが重要です。これにより、ソフトウェアのパフォーマンスと信頼性を最大化できます。

この記事について
カテゴリー一般用語
難易度上級
作成日2026/5/1