ソート
バーが小さい順に並ぶ様子を音とともに追います。アルゴリズムどうし、データどうしを並べて比べられます。
クイックソート(末尾をピボット)
0 / 0 回
速さ 速さ
回/秒
交換
選択
挿入
マージ
分割
非比較
ネットワーク
遅い
要素数 要素数
個
- 全操作
- 0回
- 比較
- 0
- 交換
- 0
- 読み取り
- 0
- 書き込み
- 0
- 最良
- 平均
- 最悪
- 補助メモリ
- 安定性
音量 音量
dB
鳴らす操作
音色
高さ
動作原理と式
操作の数え方
- 比較: 2 つの要素、または要素と手元の値を比べる 1 回
- 交換: 2 つの要素を入れ替える 1 回
- 読み取り: 配列か補助配列の値を手元へ取る 1 回。比較の分は数えない
- 書き込み: 配列か補助配列へ値を置く 1 回
比較の回数の下限
比較だけで並べ替えるには、 通りの並びを見分ける必要があります[1]。
計数・基数などの非比較のソートは、値そのものを使うのでこの下限を受けません。
データとの相性
- 挿入: 移動の回数は順序が逆の組(転倒)の数に等しい。ほぼ並び替え済みなら少ない
- 末尾をピボットにするクイック: 並び替え済みでは毎回 1 個しか分かれず、比較は 回
- 3 分割クイック: ピボットと等しい値をまとめて除くので、値の種類が少ないと速い
- ティム・パワー・スムース: すでに並んだ部分を活かす
- ソーティングネットワーク: 比べる位置が初めから決まっていて、比較の回数はデータによらない
音
値 の音の高さを次の式で決めます。比較では 2 つの値、交換では入れ替えた 2 つの値を鳴らします。値を音にする発想は The Sound of Sorting にならいました[2]。
計算量
は要素数、 は値の範囲、 は桁数です。「不明」は一般の式が知られていないものです。
| 名前 | 最良 | 平均 | 最悪 | 補助メモリ | 安定性 | 出典 |
|---|---|---|---|---|---|---|
| バブルソート | 𝑛 | 𝑛² | 𝑛² | 1 | 安定 | [1] |
| シェーカーソート | 𝑛 | 𝑛² | 𝑛² | 1 | 安定 | [1] |
| コムソート | 𝑛 log 𝑛 | 不明 | 𝑛² | 1 | 不安定 | [3][4] |
| ノームソート | 𝑛 | 𝑛² | 𝑛² | 1 | 安定 | [5] |
| 奇偶転置ソート | 𝑛 | 𝑛² | 𝑛² | 1 | 安定 | [6] |
| 選択ソート | 𝑛² | 𝑛² | 𝑛² | 1 | 不安定 | [1] |
| 双方向選択ソート | 𝑛² | 𝑛² | 𝑛² | 1 | 不安定 | |
| ヒープソート | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 1 | 不安定 | [7][8] |
| スムースソート | 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 1 | 不安定 | [9] |
| サイクルソート | 𝑛² | 𝑛² | 𝑛² | 1 | 不安定 | [10] |
| パンケーキソート | 𝑛² | 𝑛² | 𝑛² | 1 | 不安定 | [11] |
| 挿入ソート | 𝑛 | 𝑛² | 𝑛² | 1 | 安定 | [1] |
| 二分挿入ソート | 𝑛 log 𝑛 | 𝑛² | 𝑛² | 1 | 安定 | [1] |
| シェルソート | 𝑛 log 𝑛 | 不明 | 不明 | 1 | 不安定 | [12][13] |
| マージソート | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 | 安定 | [1] |
| ボトムアップマージソート | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 | 安定 | [1] |
| ティムソート(簡略版) | 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 | 安定 | [14] |
| パワーソート(簡略版) | 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 | 安定 | [15] |
| インプレースマージソート(SymMerge) | 𝑛 log 𝑛 | 𝑛 log²𝑛 | 𝑛 log²𝑛 | log 𝑛 | 安定 | [16] |
| クイックソート(末尾をピボット) | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛² | log 𝑛 | 不安定 | [17] |
| クイックソート(中央をピボット) | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛² | log 𝑛 | 不安定 | [17] |
| クイックソート(3 値の中央値をピボット) | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛² | log 𝑛 | 不安定 | [17][18] |
| 3 分割クイックソート | 𝑛 | 𝑛 log 𝑛 | 𝑛² | log 𝑛 | 不安定 | [18] |
| デュアルピボットクイックソート | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛² | log 𝑛 | 不安定 | [19][20] |
| イントロソート | 𝑛 log 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | log 𝑛 | 不安定 | [21] |
| pdqsort(簡略版) | 𝑛 | 𝑛 log 𝑛 | 𝑛 log 𝑛 | log 𝑛 | 不安定 | [22] |
| 計数ソート | 𝑛 + 𝑘 | 𝑛 + 𝑘 | 𝑛 + 𝑘 | 𝑛 + 𝑘 | 安定 | [23] |
| 基数ソート(LSD・基数 4) | 𝑑𝑛 | 𝑑𝑛 | 𝑑𝑛 | 𝑛 | 安定 | [23] |
| 基数ソート(MSD・基数 4) | 𝑑𝑛 | 𝑑𝑛 | 𝑑𝑛 | 𝑛 | 安定 | [24] |
| アメリカンフラッグソート(基数 4) | 𝑑𝑛 | 𝑑𝑛 | 𝑑𝑛 | log 𝑛 | 不安定 | [24] |
| バケットソート(√n 個) | 𝑛 | 𝑛√𝑛 | 𝑛² | 𝑛 | 安定 | [23] |
| フラッシュソート | 𝑛 | 𝑛 | 𝑛² | 𝑛 | 不安定 | [25] |
| ビーズソート | 𝑛𝑘 | 𝑛𝑘 | 𝑛𝑘 | 𝑛 | 不安定 | [26] |
| バイトニックソート | 𝑛 log²𝑛 | 𝑛 log²𝑛 | 𝑛 log²𝑛 | log 𝑛 | 不安定 | [27] |
| バッチャーの奇偶マージソート | 𝑛 log²𝑛 | 𝑛 log²𝑛 | 𝑛 log²𝑛 | 1 | 不安定 | [27] |
| ペアワイズソート | 𝑛 log²𝑛 | 𝑛 log²𝑛 | 𝑛 log²𝑛 | 1 | 不安定 | [28] |
| ストゥージソート | 𝑛2.71 | 𝑛2.71 | 𝑛2.71 | log 𝑛 | 不安定 | [29] |
| スローソート | 𝑛log 𝑛 | 𝑛log 𝑛 | 𝑛log 𝑛 | 𝑛 | 不安定 | [30] |
| ボゴソート | 𝑛 | 𝑛·𝑛! | ∞ | 1 | 不安定 | [31] |
| ボゾソート | 𝑛 | 𝑛!〜𝑛·𝑛! | ∞ | 1 | 不安定 | [31] |
出典
- 基本のソート・比較の回数の下限D. E. Knuth, The Art of Computer Programming, Vol. 3: Sorting and Searching, 2nd ed., Addison-Wesley, 1998
- 操作を音にするT. Bingmann, The Sound of Sorting, 2013
- コムW. Dobosiewicz, “An Efficient Variation of Bubble Sort,” Information Processing Letters, vol. 11, no. 1, pp. 5–6, 1980
- コムの縮小率 1.3S. Lacey, R. Box, “A Fast, Easy Sort,” Byte, vol. 16, no. 4, pp. 315–316, 318, 320, 1991
- ノームH. Sarbazi-Azad, “Stupid Sort: A New Sorting Algorithm,” Newsletter, Dept. of Computing Science, Univ. of Glasgow, 599:4, 2000。D. Grune, Gnome Sort
- 奇偶転置N. Habermann, “Parallel Neighbor Sort (or the Glory of the Induction Principle),” CMU Computer Science Report, 1972
- ヒープJ. W. J. Williams, “Algorithm 232: Heapsort,” CACM, vol. 7, no. 6, pp. 347–348, 1964
- ヒープの作り方R. W. Floyd, “Algorithm 245: Treesort 3,” CACM, vol. 7, no. 12, p. 701, 1964
- スムースE. W. Dijkstra, “Smoothsort, an alternative for sorting in situ,” Science of Computer Programming, vol. 1, no. 3, pp. 223–233, 1982
- サイクルB. K. Haddon, “Cycle-Sort: A Linear Sorting Method,” The Computer Journal, vol. 33, no. 4, pp. 365–367, 1990
- パンケーキ(反転の回数)W. H. Gates, C. H. Papadimitriou, “Bounds for Sorting by Prefix Reversal,” Discrete Mathematics, vol. 27, no. 1, pp. 47–57, 1979
- シェルD. L. Shell, “A High-Speed Sorting Procedure,” CACM, vol. 2, no. 7, pp. 30–32, 1959
- シェルの増分M. Ciura, “Best Increments for the Average Case of Shellsort,” FCT 2001, LNCS 2138, pp. 106–117
- ティムT. Peters, listsort.txt, CPython, 2002
- パワーJ. I. Munro, S. Wild, “Nearly-Optimal Mergesorts: Fast, Practical Sorting Methods That Optimally Adapt to Existing Runs,” ESA 2018, LIPIcs 112, 63:1–63:16
- インプレース(SymMerge)P.-S. Kim, A. Kutzner, “Stable Minimum Storage Merging by Symmetric Comparisons,” ESA 2004, LNCS 3221, pp. 714–723
- クイックC. A. R. Hoare, “Quicksort,” The Computer Journal, vol. 5, no. 1, pp. 10–16, 1962
- 3 値の中央値・3 分割J. L. Bentley, M. D. McIlroy, “Engineering a Sort Function,” Software: Practice and Experience, vol. 23, no. 11, pp. 1249–1265, 1993
- デュアルピボットV. Yaroslavskiy, “Replacement of Quicksort in java.util.Arrays with new Dual-Pivot Quicksort,” OpenJDK core-libs-dev, 2009
- デュアルピボットの解析S. Wild, M. E. Nebel, “Average Case Analysis of Java 7’s Dual Pivot Quicksort,” ESA 2012, LNCS 7501, pp. 825–836
- イントロD. R. Musser, “Introspective Sorting and Selection Algorithms,” Software: Practice and Experience, vol. 27, no. 8, pp. 983–993, 1997
- pdqsortO. R. L. Peters, “Pattern-defeating Quicksort,” arXiv:2106.05123, 2021
- 計数・基数・バケットT. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022
- 基数(MSD)・アメリカンフラッグP. M. McIlroy, K. Bostic, M. D. McIlroy, “Engineering Radix Sort,” Computing Systems, vol. 6, no. 1, pp. 5–27, 1993
- フラッシュK.-D. Neubert, “The Flashsort1 Algorithm,” Dr. Dobb’s Journal, vol. 23, no. 2, 1998
- ビーズJ. J. Arulanandham, C. S. Calude, M. J. Dinneen, “Bead-Sort: A Natural Sorting Algorithm,” Bulletin of the EATCS, vol. 76, pp. 153–162, 2002
- バイトニック・奇偶マージK. E. Batcher, “Sorting Networks and Their Applications,” AFIPS Spring Joint Computer Conference, vol. 32, pp. 307–314, 1968
- ペアワイズI. Parberry, “The Pairwise Sorting Network,” Parallel Processing Letters, vol. 2, no. 2–3, pp. 205–211, 1992
- ストゥージ(問題 7-3)T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Introduction to Algorithms, 2nd ed., MIT Press, 2001
- スローA. Broder, J. Stolfi, “Pessimal Algorithms and Simplexity Analysis,” SIGACT News, vol. 16, no. 3, pp. 49–53, 1984
- ボゴ・ボゾH. Gruber, M. Holzer, O. Ruepp, “Sorting the Slow Way: An Analysis of Perversely Awful Randomized Sorting Algorithms,” FUN 2007, LNCS 4475, pp. 183–197
このツールで決めたこと
- 値は 1〜 の整数
- ほぼ並び替え済みは約 5 % の要素を近くの要素と入れ替えたもの
- 「中央値付近に偏り」は平均 、標準偏差 の正規分布
- 「両端に偏り」は標準偏差 の正規分布の半分を両端から
- 「値の種類が少ない」は 5 種類、「のこぎり」は 4 山
- ティムとパワーは最小のランまで挿入で伸ばす。ギャロップはしない
- pdqsort は分岐の少ない分割を使わない
- 基数は 4、バケットは 個、フラッシュの区分は 個
- シェルの増分は Ciura の 701 まで。要素数の上限は 1,024
- ビーズは高い段から順に段ごとに全要素を読むので 回。論文の式は入力の総和に比例
- ボゾは異なる 2 つを選んで交換する形。平均は交換が 程度、比較が 以上 以下
- 双方向選択は選択ソートの最小と最大を同時に選ぶ形
- 操作は 3,000,000 回で打ち切る。比較の表示は 1,000,000 回、ボゴとボゾは 200,000 回
- 速いときは 1 コマに 8 音まで間引く