C# .NET使用哪种排序算法';s Array.Sort()方法?

C# .NET使用哪种排序算法';s Array.Sort()方法?,c#,.net,algorithm,sorting,C#,.net,Algorithm,Sorting,.NET的Array.Sort()方法使用哪种排序算法?它使用该算法 资料来源: (MSDN,备注部分) 它使用前面提到的快速排序。但并非所有数据都一样好 通过使用reflector:它在本机dll中进行排序->对于最常见的1D数组,按升序排序。然而,其他情况是在托管代码中排序的,很少应用优化。因此,它们的速度通常要慢得多 事实上,这并不像看上去那么容易。看起来.NET正在根据输入和大小实现一组不同的排序算法。我曾经从CLR中反编译Array.Sort(),它们似乎同时使用堆、插入和快速排序

.NET的
Array.Sort()方法使用哪种排序算法?

它使用该算法

资料来源:

  • (MSDN,备注部分)

它使用前面提到的快速排序。但并非所有数据都一样好


通过使用reflector:它在本机dll中进行排序->对于最常见的1D数组,按升序排序。然而,其他情况是在托管代码中排序的,很少应用优化。因此,它们的速度通常要慢得多

事实上,这并不像看上去那么容易。看起来.NET正在根据输入和大小实现一组不同的排序算法。我曾经从CLR中反编译
Array.Sort()
,它们似乎同时使用堆、插入和快速排序

Array.Sort()
根据输入的大小从三种排序算法中选择一种:

  • 如果大小小于16个元素,则使用插入排序算法
  • 如果大小超过
    2*log^N
    ,其中
    N
    是输入数组的范围,则使用堆排序算法
  • 否则,它将使用快速排序算法
  • 资料来源:。

    来自

    此方法使用内省排序(内省排序)算法作为 如下:

    如果分区大小小于16个元素,则使用插入 排序算法

    如果分区的数量超过2*LogN,其中N是 输入数组,它使用一个Heapsort算法

    否则,它使用快速排序算法

    此实现执行不稳定排序;也就是说,如果两个 元素是相等的,它们的顺序可能不会被保留。相比之下,一个 稳定排序保留相等元素的顺序

    对于使用堆排序和快速排序进行排序的数组 算法,在最坏的情况下,这个方法是一个O(n logn)操作, 其中n是长度

    调用方注意:仅使用.NET Framework 4和早期版本 快速排序算法。快速排序可识别中的无效比较器 排序操作抛出 IndexOutOfRangeException异常,并引发ArgumentException异常 调用方的异常。从.NETFramework4.5开始,它是 可能是以前引发的排序操作 ArgumentException不会引发异常,因为插入 排序和堆排序算法不会检测到无效的比较器。对于 在大多数情况下,这适用于少于16个元素的数组


    问题:除非OP特别询问.NET1.1,为什么要给他一个指向.NET1.1文档的链接?.NETFramework使用Introsort而不是版本4.5中的简单快速排序。实际上,它根据输入数组的长度使用了三种变体,正如@badgujar所描述的。(因此我投了反对票,因为你的答案(不再)正确,至少对.NET 4.5/4.6不正确)…正如这里清楚记录的那样,你需要重新阅读该主题。特别是,您的第2项不正确。它不是基于输入的大小,而是基于分区的数量
    Array.Sort
    实现Introsort,它设计用于在大多数情况下使用快速排序(增加了对小分区使用插入排序的优化),但如果它检测到项目排序导致快速排序的病态情况,它更改为Heapsort。与排序方法使用的算法的稳定性相关。相关:当您使用基于LINQ的排序时。