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

时间:2009-12-06 07:00:21

标签: c# .net algorithm sorting

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

6 个答案:

答案 0 :(得分:19)

Array.Sort()选择三种排序算法中的一种,具体取决于输入的大小:

  1. 如果大小少于16个元素,则使用插入排序算法。
  2. 如果大小超过2 * log^N,其中N是输入数组的范围,则使用堆排序算法。
  3. 否则,它使用Quicksort算法
  4. 来源:Array.Sort(Array) Method on MSDN

答案 1 :(得分:4)

它使用QuickSort算法。

来源:

答案 2 :(得分:1)

如上所述快速排序。但它并不适用于所有数据!

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

答案 3 :(得分:1)

实际上,它看起来并不那么容易。看起来.NET正在根据输入和他的大小实现一组不同的排序算法。我曾经从CLR反编译Array.Sort(),似乎他们正在使用Heap,Insertion和Quicksort。 enter image description here

答案 4 :(得分:0)

来自MSDN

的更多笔记
  

此方法将内省排序(introsort)算法用作   如下:

     

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

     

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

     

否则,它使用 Quicksort 算法。

     

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

     

对于使用Heapsort和Quicksort排序的数组   算法,在最坏的情况下,该方法是O(n log n)操作,   其中n是长度。

     

呼叫者注意事项.NET Framework 4和更早版本仅使用   Quicksort算法。 Quicksort识别中的无效比较器   在某些情况下,排序操作会引发   IndexOutOfRangeException异常,并引发ArgumentException   呼叫者的例外。从.NET Framework 4.5开始,它是   可能以前进行的排序操作   ArgumentException不会引发异常,因为插入   sort和heapsort算法不会检测到无效的比较器。对于   在大多数情况下,这适用于元素少于16个的数组。

答案 5 :(得分:-1)