ソートアルゴリズム
データを特定の順序に並べ替えるアルゴリズムの総称
アルゴリズム基礎
ソートアルゴリズムとは
ソートアルゴリズムは、データを昇順・降順に並べ替えるアルゴリズムの総称である。JavaScript の Array.prototype.sort() は内部的に TimSort (マージソート + 挿入ソートのハイブリッド) を使用している。
主要なアルゴリズム
| アルゴリズム | 平均 | 最悪 | 安定 | 特徴 |
|---|---|---|---|---|
| バブルソート | O(n²) | O(n²) | ✅ | 教育用、実用には遅い |
| 挿入ソート | O(n²) | O(n²) | ✅ | 小さい配列に高速 |
| マージソート | O(n log n) | O(n log n) | ✅ | 安定、追加メモリ O(n) |
| クイックソート | O(n log n) | O(n²) | ❌ | 実用で最速、インプレース |
| TimSort | O(n log n) | O(n log n) | ✅ | JS, Python の標準 |
| ヒープソート | O(n log n) | O(n log n) | ❌ | インプレース、キャッシュ効率が低い |
TypeScript での使用
// 数値のソート (デフォルトは文字列比較なので注意)
[10, 2, 30].sort(); // [10, 2, 30] ❌ 文字列として比較
[10, 2, 30].sort((a, b) => a - b); // [2, 10, 30] ✅
// オブジェクトのソート
users.sort((a, b) => a.age - b.age); // 年齢の昇順
users.sort((a, b) => a.name.localeCompare(b.name)); // 名前の辞書順
// 安定ソート (ES2019 で保証)
// 同じキーの要素の相対順序が保持される
安定ソート vs 不安定ソート
入力: [{name: "Alice", age: 30}, {name: "Bob", age: 30}, {name: "Carol", age: 25}]
安定ソート (age でソート):
Carol(25), Alice(30), Bob(30) ← Alice と Bob の順序が保持
不安定ソート:
Carol(25), Bob(30), Alice(30) ← Alice と Bob の順序が変わる可能性
計算量の直感
| 計算量 | 100 万件の比較回数 |
|---|---|
| O(n²) | 1 兆回 (数時間) |
| O(n log n) | 2,000 万回 (ミリ秒) |
| O(n) | 100 万回 |
DynamoDB でのソート
DynamoDB はソートキー (SK) でアイテムを自動的にソートする。クエリ結果は SK の昇順で返され、ScanIndexForward: false で降順にできる。
実務での選択
JavaScript の Array.prototype.sort() (TimSort) がほとんどのケースで最適。自前でソートアルゴリズムを実装する必要はない。
さらに掘り下げるなら関連書籍が参考になる。