.NET 4.0内部实现排序

Rom*_*rov 5 .net algorithm

我发现在Array.Sort里面,

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

被叫.有任何想法如何实现?

Han*_*ant 11

您可以从SSCLI20源代码分发中获得相当可靠的CLR源代码副本.它发布于2005年,当时是CLR版本2的一个非常准确的副本.从未发现明显的差异.

从那时起,7年前已经发生了变化,此后又发生了相当重要的CLR版本更新.但TrySZSort()仍然存在,那些低级实现是高度自我保留的.你会发现它在clr/src/vm/ecall.cpp中声明并映射到ArrayHelper :: TrySZSort(),这是在clr/src/vm/arrayhelpers.cpp中声明的C++方法

非常无聊,它只是调用一个名为的模板类方法ArrayHelpers<T>.QuickSort(),由数组元素类型专门用于值类型元素.

这就是Tony Hoare 52年前写的那种方式.虽然不是在C++中;)

你会发现这段代码是用C++编写,而不是在C#中的原因,这个答案.


Ree*_*sey 4

有什么想法如何实施吗?

该方法是在 CLR 内部的本机代码中实现的。在非常核心的低级类型上有很多类似的方法。例如,相当多的方法被System.String标记为InternalCall并在公共语言运行时本身中实现。

  • @RomanDzhabarov QuickSort - 请参阅:http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx “此方法使用 QuickSort 算法。” (3认同)