整数キーの配列をソートしています。
データに関する情報:
- 配列の長さは 1176 要素です
- キーは 750 000 から 135 000 000 の間です。0も可能
- 多くの重複があり、すべての配列には 48 から 100 の異なるキーしかありませんが、全範囲のどの値がそれらになるかを予測することは不可能です
- 多くの長いソートされたサブシーケンスがあり、ほとんどの配列は 33 から 80 のソートされたサブシーケンスで構成されています
- 最小要素は 0 です。0 の数は予測可能であり、配列ごとに約 150 という非常に狭い範囲です。
私がこれまでに試したこと:
stdlib.h qsort ;
これは遅いです。現在、私の関数は実行ごとにソートに 0.6 秒を費やしています。stdlib.h qsort では 1.0 秒です。これは std::sort と同じパフォーマンスです
ティムソート;
私はこれを試しました: https://github.com/swenson/sortとこれ: http://code.google.com/p/timsort/source/browse/trunk/timSort.c?spec=svn17&r=17 ; どちらも stdlib qsort よりも大幅に遅かった
-
クイックソートと挿入ソートの組み合わせは、これまでのところ私のデータでは最速です。さまざまな設定を試し、中央の要素 (3 の中央値ではない) としてピボットし、28 要素のサブ配列 (デフォルトでは 8 ではない) で始まる挿入ソートで最高のパフォーマンスが得られました
シェルソート;
この記事からのギャップのある単純な実装: http://en.wikipedia.org/wiki/Shellsort ; 標準ライブラリqsortより遅いですが、まともでした
私の考えでは、qsort は多くのスワップを行い、並べ替えられたサブシーケンスを台無しにする (つまり、逆にする) ため、データの構造を利用して改善する方法があるはずですが、残念ながらこれまでのところすべての試行が失敗しています。
それがどのような種類のデータであるかに興味がある場合、それらは、前のボードで既にソートされているさまざまなボードで評価されたポーカー ハンドのセットです (ソートされたサブシーケンスはここから来ます)。
関数は C です。私は Visual Studio 2010 を使用しています。何かアイデアはありますか?
サンプル データ: http://pastebin.com/kKUdnU3N
サンプル フル実行 (1176 ソート): https://dl.dropbox.com/u/86311885/out.zip