小型阵列的快速稳定排序(32或64个元素以下)

时间:2009-08-14 08:40:24

标签: .net performance arrays sorting

常识认为,对于足够小的阵列,插入排序是最好的。例如,Timsort对最多64个元素的数组使用(二进制)插入排序;来自Wikipedia

  

一些分而治之的算法,例如快速排序和合并排序,通过将列表递归地划分为较小的子列表进行排序,然后对这些子列表进行排序。这些算法在实践中的一个有用优化是使用插入排序来排序小的子列表,因为插入排序优于这些更复杂的算法。插入排序具有优势的列表大小因环境和实现而异,但通常在8到20个元素之间。

这实际上是对的吗?还有更好的选择吗?

如果这在很大程度上取决于平台,我最感兴趣的是.NET。

4 个答案:

答案 0 :(得分:3)

是的,这是我在算法类中学到的,这也是在C ++ STL中实现排序的方式。来自维基百科:

  

2000年6月的SGI C ++标准   模板库stl_algo.h   不稳定排序用途的实现   Musser introsort方法与   递归深度切换到heapsort   作为参数传递,中位数为3   枢纽选择和Sedgewick   最终插入排序传递。元素   切换到简单的阈值   插入排序是16。

去年我做了一些非正式的性能测试,C ++ STL std :: sort的速度是.NET中Array.Sort的两倍。我不知道.NET Array.Sort是如何实现的,但在.NET中,数组中的访问需要边界检查,这与C ++不同,后者可以在很大程度上解决性能差异。

答案 1 :(得分:1)

我发现它实际上取决于比较功能需要做多少工作。就像我间接排序工作表的行,并且每个比较涉及获取一行然后比较可能的几列,可能混合数字和字符串比较,它可能会变慢。

另一方面,如果阵列的长度很短,则取决于每秒需要对其进行排序的次数,因为即使它与它可能相比相对较慢,您可能也不会注意到差。

如果我有任何疑问,我只需编写一个合并排序并继续使用它。我有很好的经验,qsort不稳定,有时需要很长时间。手动编码合并排序简单,可靠,速度快。

答案 2 :(得分:0)

对于小型列表,没有比插入排序更快的O(n log n)算法。但是,有一些O(n ^ 2)算法确实存在竞争。值得注意的是,选择排序不是其中之一,尽管在交换和移动昂贵的罕见情况下它是好的。冒泡排序和变体也很简单。

网络排序:排序算法,总是稳定,没有分支。它总体上有可怕的规格,但没有分支意味着最小的列表上的出色表现。基本情况是:if(a<b) swap(a,b);

使用批次进行插入排序:在每个循环上,对2-4个元素进行排序,然后将它们一起插入。这减少了移动次数,并且对于更长的列表,比较了25%到37%。总体效果是对大小范围为16到64的列表进行优化。

答案 3 :(得分:-1)

由于.NET是一种不能编译为原始机器码的语言。我说调用API函数(使用本机代码)可能是最快的方法