【问题标题】:Which sorting algorithm is used by .NET's Array.Sort() method?.NET 的 Array.Sort() 方法使用哪种排序算法?
【发布时间】:2010-12-23 16:48:08
【问题描述】:

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

【问题讨论】:

  • 相关thread与sort方法使用的算法的稳定性有关。
  • Related thread: 当你使用基于 LINQ 的排序时。

标签: c# .net algorithm sorting


【解决方案1】:

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

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

来源:Array.Sort(Array) Method on MSDN

【讨论】:

  • 您需要重新阅读该主题。特别是,您的项目#2 不正确。它不根据输入的大小做出决定,而是根据分区数。 Array.Sort 实现 Introsort,它旨在在大多数情况下使用 Quicksort(添加了对对小分区使用插入排序),但如果它检测到项目排序导致快速排序的病态情况,它会更改为堆排序。
【解决方案2】:

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

【讨论】:

【解决方案3】:

它使用QuickSort 算法。

来源:

【讨论】:

  • 问题:除非 OP 专门询问 .NET 1.1,否则为什么要给他一个指向 .NET 1.1 文档的链接?
  • .Net 框架从 4.5 版本开始使用 Introsort 而不是简单的快速排序。 en.wikipedia.org/wiki/Introsort
  • 实际上,正如@badgujar 所描述的,它根据输入数组的长度使用了三种变体。 (因此我不赞成,因为您的答案(不再)正确,至少对于 .NET 4.5/4.6 不正确)
【解决方案4】:

来自MSDN的更多笔记

此方法使用introspective排序(introsort)算法作为 如下:

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

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

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

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

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

调用者须知 .NET Framework 4 及更早版本仅使用 快速排序算法。快速排序识别无效的比较器 在某些情况下,排序操作会引发 IndexOutOfRangeException 异常,并引发 ArgumentException 调用者的例外。从 .NET Framework 4.5 开始,它是 可能之前抛出的排序操作 ArgumentException 不会抛出异常,因为插入 排序和堆排序算法不会检测到无效的比较器。为了 大多数情况下,这适用于元素少于 16 个的数组。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 是的。上面没有提到 TrySZSort。
    【解决方案6】:

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 2010-10-25
      • 2010-09-17
      • 2011-11-14
      • 1970-01-01
      • 2011-11-02
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多