2012-08-14 111 views
5

内部实现,我发现上述的Array.Sort内,.NET 4.0的排序

[ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail), SecurityCritical] 
[MethodImpl(MethodImplOptions.InternalCall)] 
private static extern bool TrySZSort(Array keys, Array items, int left, int right); 

被调用。 任何想法如何实现?

+0

也就是说方法是在本机代码来实现,因此'extern'关键字。可能会被引用到某个地方的引用源中,但除非您只是想了解它是如何实现的,否则它可能比您在托管代码中编写的任何东西都要快。 – 2012-08-14 00:57:48

+0

http://stackoverflow.com/questions/6842090/c-sharp-fastest-way-to-sort-an-array-in-descending-order – xandercoded 2012-08-14 01:01:12

+0

我很好奇,因为天真的QuickSort被调用,除非使用默认的Comparer。那么这意味着即使TrySZSort被调用,Array.Sort也不能保证N * Log(N)最坏的情况。 – 2012-08-14 01:01:22

回答

3

任何想法,这是如何实现的?

该方法在CLR自身内部的本地代码中实现。在核心,低级别类型中有很多类似的方法。例如,System.String上的很多方法都标记为InternalCall,并在公共语言运行库本身中实现。

+0

是的,我发现它是用本机代码实现的。但它隐藏了哪种类型:快速,堆,合并,时间等? – 2012-08-14 01:16:30

+2

@RomanDzhabarov QuickSort - 请参阅:http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx“此方法使用QuickSort算法。” – 2012-08-14 01:17:38

+1

它通常不仅仅是快速排序 - 在某个级别以下切换到插入排序。另外,如果它执行的递归太多,它会切换到我认为的堆排序。 Atlease Visual Studio C运行时库排序完成这些事情。 – Fakrudeen 2012-08-14 08:34:36

11

您可以从SSCLI20 source distribution得到CLR源代码的一个相当可靠的副本。它于2005年发布,当时是CLR版本2的相当准确的副本。从未发现明显的差异。

因为那么这是行动的时候,已经7年前,自一个相当重大的CLR版本更新。但是TrySZSort()仍然存在,那些低级的实现是高度自我保存的。你会发现它在CLR/src目录/ VM/ecall.cpp声明并映射到ArrayHelper :: TrySZSort(),在声明的C++方法CLR/src目录/ VM/arrayhelpers.cpp

其实不然非常无聊,它只是调用一个名为ArrayHelpers<T>.QuickSort()的模板类方法,通过值类型元素的数组元素类型进行专门化。

这是现在的样子东尼·霍尔52年前写起来。虽然不是在C++;)

你会发现这段代码是用C++编写,而不是在C#中this answer的原因。

+0

很好的答案,谢谢。不幸的是,我无法将几个设置为最好的。 – 2012-08-14 01:52:01

+0

查看ArrayHelpers的源代码 .QuickSort():https://github.com/kasicass/sscli20/blob/dc64e12c9b835d4d373aa04978c0e8f1763b2e1b/clr/src/vm/comarrayhelpers.h#L77 – 2017-03-20 15:06:53