सिलेक्शन सॉर्ट: Difference between revisions
No edit summary |
No edit summary |
||
Line 12: | Line 12: | ||
}} | }} | ||
[[कंप्यूटर विज्ञान]] में, चयन सॉर्ट एक [[इन-प्लेस एल्गोरिदम | [[कंप्यूटर विज्ञान]] में, चयन सॉर्ट एक [[इन-प्लेस एल्गोरिदम|इन-प्लेस तुलना]] [[छँटाई एल्गोरिथ्म|सॉर्टिंग एल्गोरिदम]] है। इसमें [[ बिग ओ अंकन |O(n<sup>2</sup>)]] समय जटिलता है, जो इसे बड़ी सूचियों पर अक्षम बनाती है, और सामान्यतः समान प्रविष्टि प्रकार से भी खराब प्रदर्शन करती है। चयन सॉर्ट अपनी सादगी के लिए जाना जाता है और कुछ स्थितियों में अधिक जटिल एल्गोरिदम पर प्रदर्शन लाभ होता है, विशेषकर जहां सहायक मेमोरी सीमित होती है। | ||
एल्गोरिदम इनपुट सूची को दो भागों में विभाजित करता है: वस्तुओं की एक क्रमबद्ध उपसूची जो सूची के सामने (बाएं) पर बाएं से दाएं बनाई जाती है और शेष अवर्गीकृत वस्तुओं की एक उपसूची जो सूची के | एल्गोरिदम इनपुट सूची को दो भागों में विभाजित करता है: वस्तुओं की एक क्रमबद्ध उपसूची जो सूची के सामने (बाएं) पर बाएं से दाएं बनाई जाती है और शेष अवर्गीकृत वस्तुओं की एक उपसूची जो सूची के शेष भाग पर अधिकार कर लेती है। प्रारंभ में, क्रमबद्ध उपसूची खाली होती है और अवर्गीकृत उपसूची संपूर्ण इनपुट सूची होती है। एल्गोरिथ्म अवर्गीकृत उपसूची में सबसे छोटे (या सबसे बड़े, छँटाई क्रम के आधार पर) तत्व को ढूँढ़कर, इसे सबसे बाएँ अवर्गीकृत तत्व के साथ इसका आदान-प्रदान (स्वैपिंग) करके (इसे क्रमबद्ध क्रम में रखकर) आगे बढ़ता है, और उपसूची सीमाओं को एक तत्व को दाईं ओर ले जाता है। . | ||
चयन प्रकार की समय दक्षता द्विघात है, इसलिए कई छँटाई | चयन प्रकार की समय दक्षता द्विघात है, इसलिए कई छँटाई विधियाँ हैं जिनमें चयन प्रकार की तुलना में उत्तम समय जटिलता है। | ||
== उदाहरण == | == उदाहरण == | ||
Line 122: | Line 122: | ||
== अन्य सॉर्टिंग एल्गोरिदम की तुलना == | == अन्य सॉर्टिंग एल्गोरिदम की तुलना == | ||
द्विघात सॉर्टिंग एल्गोरिदम के बीच (बिग ओ नोटेशन के एक साधारण औसत-केस के साथ सॉर्टिंग एल्गोरिदम#बैचमन-लैंडौ नोटेशन का परिवार|Θ(n)<sup>2</sup>)), चयन सॉर्ट लगभग हमेशा [[ बुलबुले की तरह |बुलबुले की तरह]] और [[सूक्ति प्रकार]] से | द्विघात सॉर्टिंग एल्गोरिदम के बीच (बिग ओ नोटेशन के एक साधारण औसत-केस के साथ सॉर्टिंग एल्गोरिदम#बैचमन-लैंडौ नोटेशन का परिवार|Θ(n)<sup>2</sup>)), चयन सॉर्ट लगभग हमेशा [[ बुलबुले की तरह |बुलबुले की तरह]] और [[सूक्ति प्रकार]] से उत्तम प्रदर्शन करता है। सम्मिलन सॉर्ट बहुत समान है, के-वें पुनरावृत्ति के बाद, पहला <math>k</math> सरणी में तत्व क्रमबद्ध क्रम में हैं। इंसर्शन सॉर्ट का लाभ यह है कि यह केवल उतने ही तत्वों को स्कैन करता है जितनी उसे रखने के लिए आवश्यकता होती है <math>k+1</math>सेंट तत्व, जबकि चयन सॉर्ट को खोजने के लिए सभी शेष तत्वों को स्कैन करना होगा <math>k+1</math>सेंट तत्व. | ||
सरल गणना से पता चलता है कि प्रविष्टि सॉर्ट | सरल गणना से पता चलता है कि प्रविष्टि सॉर्ट सामान्यतः चयन सॉर्ट की तुलना में लगभग आधी तुलनाएँ निष्पादित करेगा, हालाँकि सॉर्टिंग से पहले सरणी जिस क्रम में थी, उसके आधार पर यह उतनी ही या उससे भी कम तुलनाएँ निष्पादित कर सकता है। इसे कुछ वास्तविक-समय कंप्यूटिंग|वास्तविक-समय अनुप्रयोगों के लिए एक लाभ के रूप में देखा जा सकता है कि चयन सॉर्ट सरणी के क्रम की परवाह किए बिना समान रूप से प्रदर्शन करेगा, जबकि सम्मिलन सॉर्ट का चलने का समय काफी भिन्न हो सकता है। हालाँकि, यह अक्सर सम्मिलन सॉर्ट के लिए एक फायदा है क्योंकि यदि सरणी पहले से ही सॉर्ट की गई है या सॉर्ट के करीब है तो यह अधिक कुशलता से चलता है। | ||
जबकि लेखन की संख्या के संदर्भ में चयन सॉर्ट सम्मिलन सॉर्ट से | जबकि लेखन की संख्या के संदर्भ में चयन सॉर्ट सम्मिलन सॉर्ट से उत्तम है (<math>n-1</math> स्वैप बनाम तक <math>n(n-1)/2</math> स्वैप, प्रत्येक स्वैप दो राइट्स के साथ), यह चक्र सॉर्ट द्वारा प्राप्त सैद्धांतिक न्यूनतम से लगभग दोगुना है, जो अधिकतम एन राइट्स करता है। यह महत्वपूर्ण हो सकता है यदि लिखना पढ़ने की तुलना में काफी महंगा है, जैसे कि [[EEPROM]] या [[फ्लैश मेमोरी]] के साथ, जहां प्रत्येक लेखन मेमोरी के जीवनकाल को कम कर देता है। | ||
सीपीयू [[शाखा भविष्यवक्ता]]ओं के लाभ के लिए चयन सॉर्ट को अप्रत्याशित शाखाओं के बिना, शाखा-मुक्त कोड के साथ न्यूनतम का स्थान ढूंढकर और फिर बिना शर्त स्वैप निष्पादित करके लागू किया जा सकता है। | सीपीयू [[शाखा भविष्यवक्ता]]ओं के लाभ के लिए चयन सॉर्ट को अप्रत्याशित शाखाओं के बिना, शाखा-मुक्त कोड के साथ न्यूनतम का स्थान ढूंढकर और फिर बिना शर्त स्वैप निष्पादित करके लागू किया जा सकता है। | ||
अंत में, बड़े सरणियों पर चयन सॉर्ट का प्रदर्शन काफी | अंत में, बड़े सरणियों पर चयन सॉर्ट का प्रदर्शन काफी उत्तम होता है <math>\Theta(n\log n)</math> फूट डालो और जीतो एल्गोरिदम|बांटो और जीतो एल्गोरिदम जैसे [[मर्ज़ सॉर्ट]] हालाँकि, प्रविष्टि सॉर्ट या चयन सॉर्ट दोनों सामान्यतः छोटे सरणियों (यानी 10-20 से कम तत्वों) के लिए तेज़ होते हैं। पुनरावर्ती एल्गोरिदम के लिए अभ्यास में एक उपयोगी अनुकूलन छोटे पर्याप्त उपसूचियों के लिए सम्मिलन सॉर्ट या चयन सॉर्ट पर स्विच करना है। | ||
== वेरिएंट == | == वेरिएंट == |
Revision as of 07:10, 18 July 2023
Class | Sorting algorithm |
---|---|
Data structure | Array |
Worst-case performance | comparisons, swaps |
Best-case performance | comparisons, swap |
Average performance | comparisons, swaps |
Worst-case space complexity | auxiliary |
कंप्यूटर विज्ञान में, चयन सॉर्ट एक इन-प्लेस तुलना सॉर्टिंग एल्गोरिदम है। इसमें O(n2) समय जटिलता है, जो इसे बड़ी सूचियों पर अक्षम बनाती है, और सामान्यतः समान प्रविष्टि प्रकार से भी खराब प्रदर्शन करती है। चयन सॉर्ट अपनी सादगी के लिए जाना जाता है और कुछ स्थितियों में अधिक जटिल एल्गोरिदम पर प्रदर्शन लाभ होता है, विशेषकर जहां सहायक मेमोरी सीमित होती है।
एल्गोरिदम इनपुट सूची को दो भागों में विभाजित करता है: वस्तुओं की एक क्रमबद्ध उपसूची जो सूची के सामने (बाएं) पर बाएं से दाएं बनाई जाती है और शेष अवर्गीकृत वस्तुओं की एक उपसूची जो सूची के शेष भाग पर अधिकार कर लेती है। प्रारंभ में, क्रमबद्ध उपसूची खाली होती है और अवर्गीकृत उपसूची संपूर्ण इनपुट सूची होती है। एल्गोरिथ्म अवर्गीकृत उपसूची में सबसे छोटे (या सबसे बड़े, छँटाई क्रम के आधार पर) तत्व को ढूँढ़कर, इसे सबसे बाएँ अवर्गीकृत तत्व के साथ इसका आदान-प्रदान (स्वैपिंग) करके (इसे क्रमबद्ध क्रम में रखकर) आगे बढ़ता है, और उपसूची सीमाओं को एक तत्व को दाईं ओर ले जाता है। .
चयन प्रकार की समय दक्षता द्विघात है, इसलिए कई छँटाई विधियाँ हैं जिनमें चयन प्रकार की तुलना में उत्तम समय जटिलता है।
उदाहरण
यहां पांच तत्वों को क्रमबद्ध करने वाले इस सॉर्ट एल्गोरिदम का एक उदाहरण दिया गया है:
Sorted sublist | Unsorted sublist | Least element in unsorted list |
---|---|---|
() | (11, 25, 12, 22, 64) | 11 |
(11) | (25, 12, 22, 64) | 12 |
(11, 12) | (25, 22, 64) | 22 |
(11, 12, 22) | (25, 64) | 25 |
(11, 12, 22, 25) | (64) | 64 |
(11, 12, 22, 25, 64) | () |
(इन अंतिम दो पंक्तियों में कुछ भी बदलाव नहीं हुआ है क्योंकि अंतिम दो संख्याएँ पहले से ही क्रम में थीं।)
चयन सॉर्ट का उपयोग सूची संरचनाओं पर भी किया जा सकता है जो जोड़ने और हटाने को कुशल बनाते हैं, जैसे कि लिंक की गई सूची। इस मामले में सूची के शेष भाग से न्यूनतम तत्व को हटाना और फिर इसे अब तक क्रमबद्ध मानों के अंत में सम्मिलित करना अधिक सामान्य है। उदाहरण के लिए:
<पूर्व शैली=अतिप्रवाह:ऑटो; चौड़ाई:ऑटो; > गिरफ्तार[] = 64 25 12 22 11
// arr[0...4] में न्यूनतम तत्व खोजें // और इसे शुरुआत में रखें 11 25 12 22 64
//arr[1...4] में न्यूनतम तत्व खोजें // और इसे गिरफ्तारी की शुरुआत में रखें[1...4] 11 12 25 22 64
//arr[2...4] में न्यूनतम तत्व खोजें // और इसे गिरफ्तारी की शुरुआत में रखें[2...4] 11 12 22 25 64
// arr[3...4] में न्यूनतम तत्व खोजें // और इसे गिरफ्तारी की शुरुआत में रखें[3...4] 11 12 22 25 64 </पूर्व>
कार्यान्वयन
नीचे C (प्रोग्रामिंग भाषा) में एक कार्यान्वयन है। <सिंटैक्सहाइलाइट लैंग= सी स्टाइल= ओवरफ्लो:ऑटो; चौड़ाई:ऑटो; पंक्ति = 1 > /* a[0] से a[aLength-1] सॉर्ट करने के लिए सरणी है */ int i,j; int aLength; // a की लंबाई से प्रारंभ करें
/* संपूर्ण सरणी में स्थिति को आगे बढ़ाएं */ /* (मैं < aLength-1 कर सकता हूं क्योंकि एकल तत्व भी न्यूनतम तत्व है) */ (i = 0; i < aLength-1; i++) के लिए {
/* अवर्गीकृत a[i .. aLength-1] में न्यूनतम तत्व ढूंढें */
/* मान लें कि न्यूनतम पहला तत्व है */ int jMin = i; /* सबसे छोटे को खोजने के लिए i के बाद तत्वों के विरुद्ध परीक्षण करें */ (j = i+1; j < aLength; j++) के लिए { /* यदि यह तत्व कम है, तो यह नया न्यूनतम है */ अगर (ए[जे] < ए[जेमिन]) { /* नया न्यूनतम मिला; इसका सूचकांक याद रखें*/ जेमिन = जे; } }
यदि (jMin != i) { स्वैप(ए[आई], ए[जेमिन]); }
} </सिंटैक्सहाइलाइट>
जटिलता
अन्य सॉर्टिंग एल्गोरिदम की तुलना में चयन सॉर्ट का विश्लेषण करना मुश्किल नहीं है, क्योंकि कोई भी लूप सरणी में डेटा पर निर्भर नहीं करता है। न्यूनतम का चयन करने के लिए स्कैनिंग की आवश्यकता होती है तत्व (लेना तुलनाएँ) और फिर इसे पहले स्थान पर स्वैप करना। अगले निम्नतम तत्व को खोजने के लिए शेष को स्कैन करने की आवश्यकता होती है तत्व वगैरह. इसलिए, तुलनाओं की कुल संख्या है
अंकगणितीय प्रगति से,
जो जटिलता का है तुलनाओं की संख्या के संदर्भ में. इनमें से प्रत्येक स्कैन के लिए एक स्वैप की आवश्यकता होती है तत्व (अंतिम तत्व पहले से ही मौजूद है)।
अन्य सॉर्टिंग एल्गोरिदम की तुलना
द्विघात सॉर्टिंग एल्गोरिदम के बीच (बिग ओ नोटेशन के एक साधारण औसत-केस के साथ सॉर्टिंग एल्गोरिदम#बैचमन-लैंडौ नोटेशन का परिवार|Θ(n)2)), चयन सॉर्ट लगभग हमेशा बुलबुले की तरह और सूक्ति प्रकार से उत्तम प्रदर्शन करता है। सम्मिलन सॉर्ट बहुत समान है, के-वें पुनरावृत्ति के बाद, पहला सरणी में तत्व क्रमबद्ध क्रम में हैं। इंसर्शन सॉर्ट का लाभ यह है कि यह केवल उतने ही तत्वों को स्कैन करता है जितनी उसे रखने के लिए आवश्यकता होती है सेंट तत्व, जबकि चयन सॉर्ट को खोजने के लिए सभी शेष तत्वों को स्कैन करना होगा सेंट तत्व.
सरल गणना से पता चलता है कि प्रविष्टि सॉर्ट सामान्यतः चयन सॉर्ट की तुलना में लगभग आधी तुलनाएँ निष्पादित करेगा, हालाँकि सॉर्टिंग से पहले सरणी जिस क्रम में थी, उसके आधार पर यह उतनी ही या उससे भी कम तुलनाएँ निष्पादित कर सकता है। इसे कुछ वास्तविक-समय कंप्यूटिंग|वास्तविक-समय अनुप्रयोगों के लिए एक लाभ के रूप में देखा जा सकता है कि चयन सॉर्ट सरणी के क्रम की परवाह किए बिना समान रूप से प्रदर्शन करेगा, जबकि सम्मिलन सॉर्ट का चलने का समय काफी भिन्न हो सकता है। हालाँकि, यह अक्सर सम्मिलन सॉर्ट के लिए एक फायदा है क्योंकि यदि सरणी पहले से ही सॉर्ट की गई है या सॉर्ट के करीब है तो यह अधिक कुशलता से चलता है।
जबकि लेखन की संख्या के संदर्भ में चयन सॉर्ट सम्मिलन सॉर्ट से उत्तम है ( स्वैप बनाम तक स्वैप, प्रत्येक स्वैप दो राइट्स के साथ), यह चक्र सॉर्ट द्वारा प्राप्त सैद्धांतिक न्यूनतम से लगभग दोगुना है, जो अधिकतम एन राइट्स करता है। यह महत्वपूर्ण हो सकता है यदि लिखना पढ़ने की तुलना में काफी महंगा है, जैसे कि EEPROM या फ्लैश मेमोरी के साथ, जहां प्रत्येक लेखन मेमोरी के जीवनकाल को कम कर देता है।
सीपीयू शाखा भविष्यवक्ताओं के लाभ के लिए चयन सॉर्ट को अप्रत्याशित शाखाओं के बिना, शाखा-मुक्त कोड के साथ न्यूनतम का स्थान ढूंढकर और फिर बिना शर्त स्वैप निष्पादित करके लागू किया जा सकता है।
अंत में, बड़े सरणियों पर चयन सॉर्ट का प्रदर्शन काफी उत्तम होता है फूट डालो और जीतो एल्गोरिदम|बांटो और जीतो एल्गोरिदम जैसे मर्ज़ सॉर्ट हालाँकि, प्रविष्टि सॉर्ट या चयन सॉर्ट दोनों सामान्यतः छोटे सरणियों (यानी 10-20 से कम तत्वों) के लिए तेज़ होते हैं। पुनरावर्ती एल्गोरिदम के लिए अभ्यास में एक उपयोगी अनुकूलन छोटे पर्याप्त उपसूचियों के लिए सम्मिलन सॉर्ट या चयन सॉर्ट पर स्विच करना है।
वेरिएंट
ढेर बनाएं और छांटें सबसे कम डेटा को खोजने और हटाने में तेजी लाने के लिए एक [[अंतर्निहित डेटा संरचना]] हीप (डेटा संरचना) डेटा संरचना का उपयोग करके बुनियादी एल्गोरिदम में काफी सुधार करता है। यदि सही ढंग से कार्यान्वित किया जाता है, तो ढेर अगले निम्नतम तत्व को ढूंढने की अनुमति देगा के बजाय समय सामान्य चयन प्रकार में आंतरिक लूप के लिए, कुल चलने का समय कम हो जाता है .
चयन सॉर्ट का एक द्विदिश संस्करण (कॉकटेल शेकर सॉर्ट की समानता के कारण डबल चयन सॉर्ट या कभी-कभी कॉकटेल सॉर्ट कहा जाता है) प्रत्येक पास में सूची में दोनों न्यूनतम और अधिकतम मान पाता है। इसके लिए नियमित चयन प्रकार की प्रति आइटम एक तुलना के बजाय प्रति दो आइटमों में तीन तुलनाओं की आवश्यकता होती है (तत्वों की एक जोड़ी की तुलना की जाती है, फिर बड़े की तुलना अधिकतम से की जाती है और छोटे की तुलना न्यूनतम से की जाती है), लेकिन इसके लिए केवल आधे पास की आवश्यकता होती है, शुद्ध 25% की बचत।
चयन सॉर्ट को सॉर्टिंग एल्गोरिदम # वर्गीकरण के रूप में कार्यान्वित किया जा सकता है, यदि चरण 2 में स्वैप करने के बजाय, न्यूनतम मान को पहली स्थिति में डाला जाता है और हस्तक्षेप करने वाले मान ऊपर स्थानांतरित हो जाते हैं। हालाँकि, इस संशोधन के लिए या तो एक डेटा संरचना की आवश्यकता होती है जो कुशल सम्मिलन या विलोपन का समर्थन करती है, जैसे कि एक लिंक की गई सूची, या यह प्रदर्शन की ओर ले जाती है लिखता है.
बिंगो सॉर्ट संस्करण में, सबसे बड़े मूल्य को खोजने के लिए शेष वस्तुओं को बार-बार देखकर और उस मूल्य के साथ सभी वस्तुओं को उनके अंतिम स्थान पर ले जाकर वस्तुओं को क्रमबद्ध किया जाता है।[1] गिनती सॉर्ट की तरह, यदि कई डुप्लिकेट मान हैं तो यह एक कुशल संस्करण है: चयन सॉर्ट प्रत्येक स्थानांतरित आइटम के लिए शेष आइटम के माध्यम से एक पास करता है, जबकि बिंगो सॉर्ट प्रत्येक मान के लिए एक पास करता है। सबसे बड़े मूल्य को खोजने के लिए प्रारंभिक पास के बाद, बाद के पास प्रत्येक आइटम को उस मूल्य के साथ उसके अंतिम स्थान पर ले जाते हैं, जबकि अगले मान को निम्नलिखित छद्मकोड में खोजते हैं (सरणी शून्य-आधारित होती है और फॉर-लूप में ऊपर और नीचे दोनों सीमाएं शामिल होती हैं) , जैसे पास्कल (प्रोग्रामिंग भाषा) में):
bingo(array A)
{ This procedure sorts in ascending order by
repeatedly moving maximal items to the end. }
begin
last := length(A) - 1;
{ The first iteration is written to look very similar to the subsequent ones,
but without swaps. }
nextMax := A[last];
for i := last - 1 downto 0 do
if A[i] > nextMax then
nextMax := A[i];
while (last > 0) and (A[last] = nextMax) do
last := last - 1;
while last > 0 do begin
prevMax := nextMax;
nextMax := A[last];
for i := last - 1 downto 0 do
if A[i] > nextMax then
if A[i] <> prevMax then
nextMax := A[i];
else begin
swap(A[i], A[last]);
last := last - 1;
end
while (last > 0) and (A[last] = nextMax) do
last := last - 1;
end;
end;
इस प्रकार, यदि औसतन समान मूल्य वाले दो से अधिक आइटम हैं, तो बिंगो सॉर्ट के तेज़ होने की उम्मीद की जा सकती है क्योंकि यह चयन सॉर्ट की तुलना में आंतरिक लूप को कम बार निष्पादित करता है।
यह भी देखें
संदर्भ
- ↑ This article incorporates public domain material from Black, Paul E. "Bingo sort". Dictionary of Algorithms and Data Structures.
- Donald Knuth. The Art of Computer Programming, Volume 3: Sorting and Searching, Third Edition. Addison–Wesley, 1997. ISBN 0-201-89685-0. Pages 138–141 of Section 5.2.3: Sorting by Selection.
- Anany Levitin. Introduction to the Design & Analysis of Algorithms, 2nd Edition. ISBN 0-321-35828-7. Section 3.1: Selection Sort, pp 98–100.
- Robert Sedgewick. Algorithms in C++, Parts 1–4: Fundamentals, Data Structure, Sorting, Searching: Fundamentals, Data Structures, Sorting, Searching Pts. 1–4, Second Edition. Addison–Wesley Longman, 1998. ISBN 0-201-35088-2. Pages 273–274
बाहरी संबंध
- Animated Sorting Algorithms: Selection Sort at the Wayback Machine (archived 7 March 2015) – graphical demonstration