【发布时间】:2010-12-23 16:48:08
【问题描述】:
.NET 的Array.Sort() 方法使用哪种排序算法?
【问题讨论】:
.NET 的Array.Sort() 方法使用哪种排序算法?
【问题讨论】:
Array.Sort() 根据输入的大小选择三种排序算法之一:
2 * log^N,其中N 是输入数组的范围,它将使用堆排序算法。【讨论】:
Array.Sort 实现 Introsort,它旨在在大多数情况下使用 Quicksort(添加了对对小分区使用插入排序),但如果它检测到项目排序导致快速排序的病态情况,它会更改为堆排序。
实际上,这并不像看起来那么容易。看起来 .NET 正在根据输入和他的大小实现一组不同的排序算法。我曾经从 CLR 反编译 Array.Sort(),似乎它们同时使用了堆、插入和快速排序。
【讨论】:
【讨论】:
来自MSDN的更多笔记
此方法使用introspective排序(introsort)算法作为 如下:
如果分区大小少于 16 个元素,则使用 插入 排序算法。
如果分区数超过2 * LogN,其中N是 输入数组,它使用堆排序算法。
否则,它使用快速排序算法。
此实现执行不稳定的排序;也就是说,如果两个 元素是相等的,它们的顺序可能不会被保留。相比之下,一个 稳定排序保留相等元素的顺序。
对于使用堆排序和快速排序进行排序的数组 算法,在最坏的情况下,此方法是 O(n log n) 操作, 其中 n 是长度。
调用者须知 .NET Framework 4 及更早版本仅使用 快速排序算法。快速排序识别无效的比较器 在某些情况下,排序操作会引发 IndexOutOfRangeException 异常,并引发 ArgumentException 调用者的例外。从 .NET Framework 4.5 开始,它是 可能之前抛出的排序操作 ArgumentException 不会抛出异常,因为插入 排序和堆排序算法不会检测到无效的比较器。为了 大多数情况下,这适用于元素少于 16 个的数组。
【讨论】:
如上所述的快速排序。但它并不适用于所有数据!
通过使用反射器:它确实在本机 dll 中排序 -> 对于一维数组的最常见情况,升序。但是,其他情况在托管代码中排序 - 几乎没有应用优化。因此,它们的速度通常要慢得多。
【讨论】:
【讨论】: