2012-08-14 108 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