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

वह विधि मूल कोड में लागू की गई है, इसलिए 'बाहरी' कीवर्ड। कहीं भी संदर्भ स्रोत में शामिल किया जा सकता है, लेकिन जब तक कि आप यह देखने के लिए उत्सुक नहीं हैं कि यह कैसे कार्यान्वित किया गया है, यह शायद प्रबंधित कोड में आप जो कुछ भी लिख सकते हैं उससे तेज हो जा रहा है। –

+0

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

+0

मैं उत्सुक हूं क्योंकि निष्क्रिय तुलनाकर्ता को तब तक बुलाया जाता है जब तक कि डिफ़ॉल्ट तुलनाकर्ता का उपयोग नहीं किया जाता है। तो क्या इसका मतलब है Array.Sort N * लॉग (एन) सबसे खराब मामला गारंटी नहीं देता है भले ही TrySZSort को बुलाया गया हो या नहीं। –

उत्तर

3

कोई विचार यह कैसे लागू किया जाता है?

यह विधि देशी कोड में लागू है, सीएलआर के भीतर आंतरिक। बहुत कोर, निम्न स्तर के प्रकारों पर इस तरह के कई तरीके हैं। उदाहरण के लिए, System.String पर कुछ विधियों को InternalCall ध्वजांकित किया गया है और सामान्य भाषा रनटाइम में ही लागू किया गया है।

+0

हां, मुझे लगता है कि यह देशी कोड में लागू किया गया है। लेकिन यह किस प्रकार की छुपाता है: त्वरित, ढेर, विलय, समय, आदि? –

+2

@RomanDzhabarov QuickSort - देखें: http://msdn.microsoft.com/en-us/library/kwx6zbd4.aspx "यह विधि QuickSort एल्गोरिदम का उपयोग करती है।" –

+1

यह आम तौर पर केवल त्वरित प्रकार नहीं है - एक निश्चित स्तर से नीचे यह प्रविष्टि प्रकार के लिए स्विच करता है। इसके अलावा यदि यह बहुत अधिक रिकर्सन करता है, तो यह मुझे विश्वास करने के लिए स्विच करता है। एटलीज विजुअल स्टूडियो सी रनटाइम लाइब्रेरी सॉर्ट इन चीजों को करता है। – Fakrudeen

11

आप SSCLI20 source distribution से सीएलआर स्रोत कोड की एक काफी विश्वसनीय प्रति प्राप्त कर सकते हैं। यह 2005 में प्रकाशित हुआ था और, उस समय, सीएलआर संस्करण 2 की एक बहुत ही सटीक प्रति थी। कभी भी एक स्पष्ट विसंगति नहीं मिली।

तब से यह पहले से ही 7 साल पहले और इसके बजाय एक बड़ा सीएलआर संस्करण अपडेट तब से चलाया गया है। लेकिन TrySZSort() अभी भी आसपास है, उन निम्न-स्तरीय कार्यान्वयन अत्यधिक आत्म-संरक्षित हैं। आप इसे clr/src/VM/ecall.cpp में घोषित कर दिया और ArrayHelper को :: TrySZSort(), एक सी ++ विधि में घोषित मैप किया clr/src/VM/arrayhelpers.cpp

यह अन्यथा बहुत है मिल जाएगा उबाऊ, यह सिर्फ ArrayHelpers<T>.QuickSort() नामक टेम्पलेट क्लास विधि को कॉल करता है, जो मूल्य प्रकार तत्वों के लिए सरणी तत्व प्रकार द्वारा विशिष्ट है।

टोनी होरे ने 52 साल पहले इसे लिखा था। हालांकि C++ में नहीं;)

आपको यह कोड सी ++ में लिखा गया है और सी # में this answer में नहीं मिला है।

+0

ग्रेट उत्तर, धन्यवाद। दुर्भाग्य से मैं कई को सर्वश्रेष्ठ के रूप में सेट नहीं कर सकता। –

+0

ArrayHelpers के लिए स्रोत कोड देखें .QuickSort(): https://github.com/kasicass/sscli20/blob/dc64e12c9b835d4d373aa04978c0e8f1763b2e1b/clr/src/vm/comarrayhelpers.h#L77 –