निम्नलिखित निर्धारक (तुलनित्र के बिना) एल्गोरिथ्म एक इनपुट ट्यूपल लिए काम करता है :(a1,…,an)
- है फिशर-येट्स शफ़ल कुछ स्थिर जोड़ी के साथ अपने तुलनित्र का उपयोग कर (कहना ) एक सिक्का फ्लिप के रूप में (कर स्वीकृति-अस्वीकृति नमूना)। तुलनित्र आउटपुट हैं पहली बार, का उपयोग यह नियतात्मक मामले में एक अंतहीन अस्वीकृति पाश से बचने के लिए उल्टे।a1<a21
- (वैकल्पिक स्पीडअप: एकल जोड़ी बार कोशिश करें , जहां लंबाई या आपका इनपुट है। यदि कोई भी दो आउटपुट अलग-अलग हो तो (1) में प्राप्त क्रमचय वापस आ सकता है)nn
- मर्ज सॉर्ट का उपयोग करके अपने सरणी को सॉर्ट करें।
तुलनित्र के रूप में एक नियतात्मक आदेश संबंध को देखते हुए, यह एल्गोरिथ्म समय- में एक सरणी सॉर्ट करता है, क्योंकि फिशर-येट्स फेरबदल में चलता है, जो कि का उपयोग करता है प्रत्येक चरण में गैर-यादृच्छिक "यादृच्छिक बिट्स" (जैसे आपके तुलनित्र को कॉल करता है) और मर्ज सॉर्ट में समान स्पर्शोन्मुख जटिलता होती है। (1) का परिणाम इस मामले में पूरी तरह से बेकार है, लेकिन चूंकि यह एक वास्तविक प्रकार का अनुसरण करता है, इसलिए इससे कोई नुकसान नहीं होता है।O(nlogn)O(n)O(logn)
तुलनित्र के रूप में एक वास्तविक सिक्के को फ्लिप करते हुए (1) प्रत्येक क्रमपरिवर्तन के लिए समान संभावना वाले सरणी की अनुमति देता है और यदि आपको वास्तव में करना है (3) (आपने छोड़ दिया (2) या (2) यादृच्छिकता निर्धारित करने में विफल रहा), यह नहीं है हानि क्योंकि इसके परिणाम का वितरण केवल इसके इनपुट के आदेश पर निर्भर करता है जो कि (1) के कारण सभी क्रमपरिवर्तन के बीच समान रूप से वितरित किया जाता है, इसलिए संपूर्ण एल्गोरिथ्म का परिणाम भी समान रूप से वितरित किया जाता है। प्रत्येक स्वीकृति-अस्वीकृति के नमूने को जितनी बार दोहराया जाना है, वह ज्यामितीय रूप से वितरित किया जाता है (संभावना के साथ अस्वीकार ) और इसलिए इसका एक अपेक्षित मूल्य है । प्रत्येक पुनरावृत्ति का उपयोग अधिकांश बिट्स पर किया जाता है, इसलिए रनटाइम विश्लेषण लगभग वैसा ही होता है जैसा निर्धारक मामले में होता है, लेकिन हमें केवल एक ही मिलता है<12<2lognउम्मीद क्रम की , nontermination की संभावना (समाप्त के साथ ही लगभग निश्चित रूप से )।O(nlogn)
जैसा कि जो बताया गया है: यदि आप पहले बिट में (1) के लिए परीक्षा पसंद नहीं करते हैं, तो (3) फिर (1) करें और उपयोग करें जो हमेशा , क्योंकि सरणी पहले से नियतात्मक मामले में क्रमबद्ध है । इसके अतिरिक्त आपको अपनी यादृच्छिक संख्या को लूप में सीमा पर ऊपरी सीमा से घटाना होगा, क्योंकि यादृच्छिक संख्या के लिए ऊपरी बाध्य समान क्रमपरिवर्तन देता है। लेकिन ध्यान रखें कि (2) तब मना किया जाता है, क्योंकि आपको हमेशा फेरबदल के मामले में फेरबदल करना पड़ता है।an<a10
आप (1) और (3) के लिए अपने तुलनित्र को समान कॉल का उपयोग कर सकते हैं, लेकिन फिर यह साबित करना कि परिणाम समान रूप से वितरित किया गया है, कम से कम बहुत कठिन है, यदि संभव हो तो।
निम्नलिखित एल्गोरिथ्म में फेरबदल करने और क्रमबद्ध करने के लिए कोई अलग-अलग चरण नहीं हैं, लेकिन यह asymptotically धीमा है। यह अनिवार्य रूप से
द्विआधारी खोज के साथ
सम्मिलन प्रकार है । मैं का उपयोग करेगा इनपुट और निरूपित करने के लिए के बाद परिणाम को निरूपित करने के दौर मई:
a=(a1,…,an)bk=(bk,1,…,bk,k)k
- सेट करेंb1,1=a1
- यदि तो और अन्यथा और । या तो मामले में हमेशा तुलनित्र के लिए (यानी गलत) होगा।a2<a1b2=(a2,a1)(c,d):=(2,1)b2=(a1,a2)(c,d):=(1,2)ad<ac0
- प्राप्त करने के लिए के लिए प्राप्त पहले।bkk≥3bk−1
- बता दें कि और , यानी की सबसे कम शक्ति है जो से छोटी नहीं है ।l=⌈log2k⌉k′=2lk′2k
- आज्ञा दें । प्रत्येक लिए
i0=0j∈{1,…,l}
ij=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪ij−1+2l−jij−1ij−1+2l−jij−1ij−1+2l−j>k−1∧ad<acij−1+2l−j>k−1∧¬(ad<ac)ij−1+2l−j≤k−1∧bk−1,ij−1+2l−j<akij−1+2l−j≤k−1∧¬(bk−1,ij−1+2l−j<ak)
- यदि रिपीट (5.) औरil>kbk=(bk−1,1,…,bk−1,il−1,ak,bk−1,il,…,bk−1,k−1)
- आउटपुटbn
यादृच्छिक मामले: 5 + यदि 6 का खंड अनिवार्य रूप से स्वीकृति-अस्वीकृति नमूना है। एल्गोरिथ्म के बाकी एक भोला-भाला है: पहले तत्वों को फेरबदल करें और प्रत्येक स्थिति में तत्व को समान संभावना के साथ जोड़ें । यदि हम सामान्य सम्मिलन प्रकार का उपयोग करते हैं, तो हमें इसके बजाय एक द्विपद वितरण मिलेगा।k−1k
ध्यान दें कि यह एल्गोरिथ्म फिशर-येट्स के फेरबदल की तुलना में दोनों मोड में अक्षम है और एक मनमाना स्थिति में एक तत्व को सम्मिलित करने के रूप में मर्ज करना महंगा है यदि किसी सूची का उपयोग करते हुए सरणी और बाइनरी खोज को रैखिक समय की आवश्यकता होती है। लेकिन शायद हीप सॉर्ट या ट्री सॉर्ट का एक संशोधन इसी तरह से एक तेज एल्गोरिदम हो सकता है।