より高速なqsortクイックソート qs19
2019年にqsort(qs15)を公開しました。
https://qiita.com/t-kawa/items/631564a703e20dceed24
2020~2021年に安定なクイックソートsqsort(ss18)を公開しました。
https://qiita.com/t-kawa/items/dc15243e160a4af90518
qsort は timsort や sqsort より高速です。( timsort < sqsort < qsort )
ただし、qsortは非安定です。
sqsort開発の過程で、
「安定性がなくても、とにかく高速なソートが必要だ」
と感じました。
今回、sqsortで使用した方法で、qs15より約5%高速なqs19を開発しました。
qsort(qs19)のソースコード・ベンチマークプログラムなどは
http://ww51.tiki.ne.jp/~srr-cake/qsort/qs19/ にあります。
qsort19.cのソースコードは約500行です。
timsort ( 約1300行 ) よりかなりコンパクトです。
言語Cの標準ライブラリのqsortと今回のqsort19の処理時間を
測定したものを以下に記載します。
まだまだ多くの標準ライブラリのqsortが低速であると思われます。
ご興味がおありの方は、上記のベンチマークプログラムを動かして
その結果をこのQiitaのコメント欄に掲示して頂けないでしょうか。
----------------- benchmark.txt begin --------------------
キー:同値なし 要素:1万個 要素サイズ:8または4,20,80,1000byte
qsort d=-3 e=10000 s=8 R4000 M000:000:000:0: c=136763 547054643 T=3.75 94
qsort19 d=-3 e=10000 s=8 R4000 M120:580:000:0: c=128058 512234423 T=3.27 82
qsort d=-3 e=10000 s=20 R3000 M000:000:000:0: c=136748 410244182 T=4.73 158
qsort19 d=-3 e=10000 s=20 R3000 M120:580:000:0: c=128053 384160670 T=3.00 100
qsort d=-3 e=10000 s=80 R3000 M000:000:000:0: c=136748 410244182 T=3.61 120
qsort19 d=-3 e=10000 s=80 R3000 M120:580:000:0: c=128053 384160670 T=3.31 110
qsort d=-3 e=10000 s=1000 R600 M000:000:000:0: c=136776 82066150 T=3.47 578
qsort19 d=-3 e=10000 s=1000 R600 M120:580:000:0: c=128090 76854257 T=1.69 281
キー種別:100種 要素:1万個 要素サイズ:8または4,20,80,1000byte
qsort d=100 e=10000 s=8 R6000 M000:000:000:0: c=62894 377366851 T=2.44 41
qsort19 d=100 e=10000 s=8 R6000 M120:580:000:0: c=60849 365096092 T=2.28 38
qsort d=100 e=10000 s=20 R3000 M000:000:000:0: c=62889 188668276 T=2.52 84
qsort19 d=100 e=10000 s=20 R3000 M120:580:000:0: c=60841 182523251 T=1.36 45
qsort d=100 e=10000 s=80 R4000 M000:000:000:0: c=62897 251590917 T=2.39 60
qsort19 d=100 e=10000 s=80 R4000 M120:580:000:0: c=60844 243378572 T=2.06 52
qsort d=100 e=10000 s=1000 R500 M000:000:000:0: c=62849 31424752 T=2.19 438
qsort19 d=100 e=10000 s=1000 R500 M120:580:000:0: c=60866 30433364 T=1.16 231
キー種別:2種 要素:1万個 要素サイズ:8または4,20,80,1000byte
qsort d=2 e=10000 s=8 R30000 M000:000:000:0: c=15020 450617436 T=2.81 9
qsort19 d=2 e=10000 s=8 R30000 M120:580:000:0: c=15051 451545559 T=2.42 8
qsort d=2 e=10000 s=20 R13000 M000:000:000:0: c=15019 195259918 T=4.09 31
qsort19 d=2 e=10000 s=20 R13000 M120:580:000:0: c=15051 195672706 T=1.20 9
qsort d=2 e=10000 s=80 R12000 M000:000:000:0: c=15019 180239524 T=2.44 20
qsort19 d=2 e=10000 s=80 R12000 M120:580:000:0: c=15051 180619742 T=1.22 10
qsort d=2 e=10000 s=1000 R1200 M000:000:000:0: c=15020 18024163 T=2.90 242
qsort19 d=2 e=10000 s=1000 R1200 M120:580:000:0: c=15082 18098625 T=0.84 70
キー:同値なし 百~百万要素 要素サイズ:200byte
qsort d=-3 e=100 s=200 R400000 M000:000:000:0: c=644 257805086 T=3.30 1
qsort19 d=-3 e=100 s=200 R400000 M120:580:000:0: c=605 242260779 T=2.44 1
qsort d=-3 e=1000 s=200 R28000 M000:000:000:0: c=10064 281797331 T=3.35 12
qsort19 d=-3 e=1000 s=200 R28000 M120:580:000:0: c=9362 262156451 T=2.33 8
qsort d=-3 e=10000 s=200 R2000 M000:000:000:0: c=136727 273455402 T=3.25 162
qsort19 d=-3 e=10000 s=200 R2000 M120:580:000:0: c=128089 256178193 T=2.45 123
qsort d=-3 e=100000 s=200 R120 M000:000:000:0: c=1729580 207549609 T=3.00 2500
qsort19 d=-3 e=100000 s=200 R120 M120:580:000:0: c=1626865 195223804 T=2.77 2305
qsort d=-3 e=1000000 s=200 R11 M000:000:000:0: c=20994830 230943134 T=3.33 30245
qsort19 d=-3 e=1000000 s=200 R11 M120:580:000:0: c=19665513 216320653 T=3.08 27982
================= benchmark.txt end ====================
qsort :ベンチマークテスト実行の計算機上の C ライブラリの qsort
qsort19 :今回公開した qsort19の qsort
d=キー種類 (d=-3は、ユニーク乱数。d=kは、rand()%k でキーを算出。
e=要素数 s=要素サイズ R繰返し回数 c=比較回数/R T=処理秒数
各行の最後の数値がソート1回あたりの処理時間(10μ秒単位)です