我正在对整数键数组进行排序。
有关数据的信息:
- 数组长 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 ;它很不错,虽然比 stdlib qsort 慢
我的想法是 qsort 做了很多交换和破坏(即反向)排序的子序列,所以应该有一些方法可以通过利用数据结构来改进它,不幸的是到目前为止我所有的尝试都失败了。
如果您好奇这是什么类型的数据,这些是在已经在前一个板上排序的各种板上评估的扑克手组(这是排序子序列的来源)。
该函数在 C 中。我使用 Visual Studio 2010。有什么想法吗?
示例数据: http: //pastebin.com/kKUdnU3N
示例完整执行(1176 种):https ://dl.dropbox.com/u/86311885/out.zip