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