【问题标题】:What is the algorithm used by sort() method on Array class in .NET?.NET 中 Array 类的 sort() 方法使用的算法是什么?
【发布时间】:2017-08-21 14:49:47
【问题描述】:

MSDNsort() 方法的描述说:

使用 Array 中每个元素的 IComparable 实现对整个一维 Array 中的元素进行排序。

我检查了 IComparable,但没有发现任何东西表明正在使用哪种排序算法。

我需要知道sort() 方法对并行处理的友好程度。

有人知道Array 类上的sort() 方法使用的算法是什么吗?

【问题讨论】:

  • 我需要知道 sort() 方法对并行处理的友好程度如何 .NET 的所有排序算法都是单线程的。
  • 链接到要求在 .net 中进行并行排序的问题:Parallel Sort Algorithm
  • @xanatos 谢谢,我已经了解排序算法,而且我也知道设计用于并行处理环境的最佳算法是 Merge Sort ,我只是不知道不知道 sort() 中使用的算法是什么,请为您的第一条评论提供参考,即 .NET 中的所有排序算法都是单线程的?你知道除了 sort() on Array 之外的其他方法吗?再次感谢
  • 我知道 .NET 中只有四种类型:Array.Sort(静态)、ArrayList.Sort(实例)、List.Sort(实例)、Enumerable.OrderBy(静态,LINQ @ 987654331@),所以通过了解它们是如何工作的,我可以知道它们没有并行化...一般来说并行化是非常专业的,仅用于非常大的集合。
  • 你说,“我也知道设计用于并行处理环境的最好的一种是合并排序。”如何,请告诉我,你“知道”吗?请指出我的参考。

标签: .net algorithm sorting


【解决方案1】:

来自MSDN documentation

该方法使用内省排序(introsort)算法如下:

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

  • 如果分区数超过 2 * LogN,其中 N 是输入数组的范围,则使用 Heapsort 算法。

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

【讨论】:

  • 我没有看到那部分文档,谢谢,
【解决方案2】:

复制粘贴如下:

public static void Sort(Array keys, Array items, int index, int length, IComparer comparer) {
    if (keys==null)
        throw new ArgumentNullException("keys");
    if (keys.Rank != 1 || (items != null && items.Rank != 1))
        throw new RankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));
    if (items != null && keys.GetLowerBound(0) != items.GetLowerBound(0))
        throw new ArgumentException(Environment.GetResourceString("Arg_LowerBoundsMustMatch"));
    if (index < keys.GetLowerBound(0) || length < 0)
        throw new ArgumentOutOfRangeException((length<0 ? "length" : "index"), Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum"));
    if (keys.Length - (index - keys.GetLowerBound(0)) < length || (items != null && (index - items.GetLowerBound(0)) > items.Length - length))
        throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen"));

    Contract.EndContractBlock();

    if (length > 1) {
        if (comparer == Comparer.Default || comparer == null) {
            bool r = TrySZSort(keys, items, index, index + length - 1);
            if (r)
                return;
        }

        Object[] objKeys = keys as Object[];
        Object[] objItems = null;
        if (objKeys != null)
            objItems = items as Object[];
        if (objKeys != null && (items==null || objItems != null)) {
            SorterObjectArray sorter = new SorterObjectArray(objKeys, objItems, comparer);
            sorter.Sort(index, length);
        }
        else {
            SorterGenericArray sorter = new SorterGenericArray(keys, items, comparer);
            sorter.Sort(index, length);
        }
    }
}

您可以从https://referencesource.microsoft.com/ 获取详细信息,Array 课程位于:https://referencesource.microsoft.com/#mscorlib/system/array.cs,156e066ecc4ccedf

一个非常快速的gander 看起来它是不可并行的。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多