
एक दूसरे से अधिक या कम विभिन्न प्रकार की संख्या सौ से अधिक होने की गारंटी है। उनमें एल्गोरिदम के उपसमूह हैं जो एक दूसरे से न्यूनतम रूप से भिन्न हैं, कुछ सामान्य मुख्य विचार में मेल खाते हैं। वास्तव में, अलग-अलग वर्षों में, अलग-अलग लोग एक ही क्रमबद्ध नए सिरे से आते हैं, बहुत मौलिक विवरणों में भिन्न नहीं होते हैं।
इस तरह के एक एल्गोरिथम विचार दूसरों की तुलना में अधिक बार पाया जाता है।
प्रत्येक तत्व सरणी के
उस स्थान पर लगभग दर्ज किया जाता है जहां इसे स्थित होना चाहिए। यह एक
लगभग ऑर्डर की गई सरणी है। आवेषण द्वारा छांटना लागू किया जाता है (यह लगभग ऑर्डर किए गए सरणियों को संसाधित करने के लिए सबसे प्रभावी है) या स्थानीय अनियंत्रित क्षेत्रों को एक ही एल्गोरिदम द्वारा पुनरावर्ती रूप से संसाधित किया जाता है।

यह लेख EDISON के समर्थन से लिखा गया था, जो विभिन्न प्रकार के कार्यों के लिए समाधानों की एक विस्तृत श्रृंखला विकसित करता है: नदी और समुद्री जहाजों के बीच एक एलईडी ट्रांसमिशन सिस्टम के लिए मल्टी-ब्रांड स्टोर के कपड़े पर ऑनलाइन कोशिश करने वाले कार्यक्रमों से।
हम एल्गोरिदम के सिद्धांत से प्यार करते हैं! ;-)
यह निर्धारित करने के लिए कि आप तत्व को कहाँ रखना चाहते हैं, आपको यह पता लगाना होगा कि यह सरणी के औसत तत्व से कितना भिन्न है। ऐसा करने के लिए, आपको न्यूनतम और अधिकतम तत्वों और सरणी के आकार के मूल्यों को जानना होगा।
छांटे गए सरणी में वास्तव में यादृच्छिक डेटा होना चाहिए। इस पद्धति के सभी आविष्कारक एक ही सूत्र में आते हैं:
k उस सरणी में अनुमानित स्थान है जहाँ तत्व
A (
i ) होना चाहिए
न्यूनतम ,
अधिकतम -
ए में न्यूनतम और अधिकतम तत्वों के मूल्य
आकार - सरणी
ए में तत्वों की संख्या
यहाँ इस तरह के एक सामान्य विचार है। आइए देखें कि यह एल्गोरिथम बार-बार किन रूपों में पैदा हुआ था।
राजा सुलैमान छँटाई :: सुलैमान
यह विधि (और इसका सुंदर नाम)
V2008n के उपयोगकर्ता
द्वारा लगभग 5 साल पहले
प्रस्तावित की गई थी। हर चीज का अपना समय होता है, "पत्थरों को बिखेरने का समय और पत्थरों को इकट्ठा करने का समय" (राजा सोलोमन की पुस्तक एक्लेस्टीसेस की पुस्तक से) - और एल्गोरिथ्म में, ठीक यही होता है। सबसे पहले, सूत्र की सहायता से, हम सरणी में वांछित स्थानों पर तत्वों को बिखेरते हैं। चूंकि सूत्र एक सटीक नहीं देता है, लेकिन एक अनुमानित स्थान है, कई तत्व जो एक बार में कुछ पदों के लिए मूल्य दावे में एक दूसरे के करीब हैं। इन स्थानीय तत्व समूहों को आवेषण द्वारा क्रमबद्ध किया जाता है और फिर अंतिम क्रम में इकट्ठा किया जाता है।
इंटरपोलेशन सॉर्ट
"सूरज के नीचे कुछ भी नया नहीं है," उसी लेखक को फिर से उद्धृत करने के लिए। विकिपीडिया इंटरपोल की छँटाई का वर्णन करता है, सुलैमान की छँटाई का संदेह है। प्रत्येक "पत्थरों का ढेर" एक छोटा अतिरिक्त गतिशील सरणी है, जहां समान महत्व के तत्व स्थित हैं। मुख्य अंतर यह है कि "बिखरे हुए पत्थरों" के बाद तत्वों के इन स्थानीय अनसोल्ड समूहों को आवेषण द्वारा नहीं, बल्कि प्रक्षेप द्वारा खुद को छांट कर (पुनरावर्ती या लूप में) किया जाता है।
एक ऑर्डर किया गया सरणी एक असतत डेटा सेट है जिसे एक निश्चित अज्ञात फ़ंक्शन के ज्ञात मानों के परिमित सेट के रूप में माना जा सकता है। दरअसल, कम्प्यूटेशनल गणित के दृष्टिकोण से एक अनुमानित वितरण - यह प्रक्षेप है।
जावास्क्रिप्ट इंटरपोलेशन सॉर्ट - लूपबैकArray.prototype.interpolationSort = function() { var divideSize = new Array(); var end = this.length; divideSize[0] = end; while(divideSize.length > 0) {divide(this);} function divide(A) { var size = divideSize.pop(); var start = end - size; var min = A[start]; var max = A[start]; var temp = 0; for(var i = start + 1; i < end; i++) { if(A[i] < min) { min = A[i]; } else { if(A[i] > max) {max = A[i];} } } if(min == max) { end = end - size; } else { var p = 0; var bucket = new Array(size); for(var i = 0; i < size; i++) {bucket[i] = new Array();} for(var i = start; i < end; i++) { p = Math.floor(((A[i] - min) / (max - min)) * (size - 1)); bucket[p].push(A[i]); } for(var i = 0; i < size; i++) { if(bucket[i].length > 0) { for(var j = 0; j < bucket[i].length; j++) {A[start++] = bucket[i][j];} divideSize.push(bucket[i].length); } } } } };
जावास्क्रिप्ट इंटरपोलेशन सॉर्ट - पुनरावर्ती संस्करण Array.prototype.bucketSort = function() { var start = 0; var size = this.length; var min = this[0]; var max = this[0]; for(var i = 1; i < size; i++) { if (this[i] < min) { min = this[i]; } else { if(this[i] > max) {max = this[i];} } } if(min != max) { var bucket = new Array(size); for(var i = 0; i < size; i++) {bucket[i] = new Array();} var interpolation = 0; for(var i = 0; i < size; i++){ interpolation = Math.floor(((this[i] - min) / (max - min)) * (size - 1)); bucket[interpolation].push(this[i]); } for(var i = 0; i < size; i++) { if(bucket[i].length > 1) {bucket[i].bucketSort();}
हिस्टोग्राम सॉर्ट :: हिस्टोग्राम सॉर्ट
यह प्रक्षेप द्वारा छँटाई का एक अनुकूलन है, जो स्थानीय अनसोल्ड समूहों से संबंधित तत्वों की संख्या को गिनता है। यह गणना आपको परिणामी सरणी में सीधे अलग-अलग आइटम डालने की अनुमति देती है (बजाय उन्हें अलग-अलग छोटे सरणियों में समूहित किए)।
जावास्क्रिप्ट बार सॉर्ट करें Array.prototype.histogramSort = function() { var end = this.length; var sortedArray = new Array(end); var interpolation = new Array(end); var hitCount = new Array(end); var divideSize = new Array(); divideSize[0] = end; while(divideSize.length > 0) {distribute(this);} function distribute(A) { var size = divideSize.pop(); var start = end - size; var min = A[start]; var max = A[start]; for(var i = start + 1; i < end; i++) { if (A[i] < min) { min = A[i]; } else { if (A[i] > max) {max = A[i];} } } if (min == max) { end = end - size; } else { for(var i = start; i < end; i++){hitCount[i] = 0;} for(var i = start; i < end; i++) { interpolation[i] = start + Math.floor(((A[i] - min) / (max - min)) * (size - 1)); hitCount[interpolation[i]]++; } for(var i = start; i < end; i++) { if(hitCount[i] > 0){divideSize.push(hitCount[i]);} } hitCount[end - 1] = end - hitCount[end - 1]; for(var i = end - 1; i > start; i--) { hitCount[i - 1] = hitCount[i] - hitCount[i - 1]; } for(var i = start; i < end; i++) { sortedArray[hitCount[interpolation[i]]] = A[i]; hitCount[interpolation[i]]++; } for(var i = start; i < end; i++) {A[i] = sortedArray[i];} } } };
इंटरपोलेशन टैग प्रकार
ओवरहेड को और अधिक अनुकूलित करने के लिए, यहां यह प्रस्तावित किया गया है कि अनसोल्ड समूहों में समान तत्वों की संख्या को याद न रखें, लेकिन इन समूहों की शुरुआत को ट्रू / फाल्स झंडे के साथ चिह्नित करें। सत्य का अर्थ है कि उपसमूह पहले से ही सॉर्ट किया गया है, और गलत का मतलब है कि यह अभी तक नहीं है।
जावास्क्रिप्ट ने प्रक्षेप प्रक्षेप को टैग किया Array.prototype.InterpolaionTagSort = function() { var end = this.length; if(end > 1) { var start = 0 ; var Tag = new Array(end);
इंटरपोलेशन टैग सॉर्ट (इन-प्लेस)
यदि सरणी में तत्वों के मूल्यों को दोहराया नहीं जाता है और समान रूप से वितरित किया जाता है (मोटे तौर पर बोलना - यदि सॉर्ट किए गए फॉर्म में डेटा एक अंकगणितीय प्रगति की तरह है), तो आप एक पास में छंटनी कर सकते हैं, जगह में सही छंटनी कर सकते हैं, तत्वों को मध्यवर्ती सरणियों में स्थानांतरित किए बिना।
जावास्क्रिप्ट में लेबल (जगह में) के साथ प्रक्षेप द्वारा क्रमबद्ध करें Array.prototype.InPlaceTagSort = function() { var n = this.length; var Tag = new Array(n); for(i = 0; i < n; i++) {Tag[i] = false;} var min = this[0]; var max = this[0]; for(i = 1; i < n; i++) { if(this[i] < min) { min = this[i]; } else { if(this[i] > max) {max = this[i];} } } var p = 0; var temp = 0; for(i = 0; i < n; i++) { while(Tag[i] == false) { p = Math.floor(((this[i] - min) / (max - min)) * (n - 1)); temp = this[i]; this[i] = this[p]; this[p] = temp; Tag[p] = true; } } };
फ़्लैश सॉर्ट :: फ्लैशशॉट
एक बार, मैंने छँटाई के बारे में
लिखा था, जो 1998 में बायोफिज़िक्स नूबर्ट के प्रोफेसर द्वारा आविष्कार किया गया था।
प्रोफेसर ने तत्वों को कई अलग-अलग वर्गों में बांटने का सुझाव दिया (वर्ग सदस्यता तत्व के आकार से निर्धारित होती है)। इसे ध्यान में रखते हुए, सूत्र इस तरह दिखता है:
आकार (सरणी आकार) के बजाय, सूत्र
मीटर को इंगित करता है - वर्गों की संख्या जिसके द्वारा हम सरणी के तत्वों को वितरित करते हैं। सूत्र उस सरणी में कुंजी की गणना नहीं करता है जहां तत्व को फेंक दिया जाना चाहिए, लेकिन वर्ग संख्या जिसमें तत्व है।
यह छांटना बुरा नहीं है कि यह अतिरिक्त मेमोरी के बारे में अधिक किफायती है। तत्वों का पुनर्वितरण जगह में होता है। केवल कक्षाओं का स्थानीयकरण अलग से संग्रहीत किया जाता है (ठीक है, यदि आप एक अलग कोण से देखते हैं, तो किसी विशेष वर्ग से संबंधित तत्वों की संख्या अलग से संग्रहीत होती है)।
खैर, बाकी तो वही गाना है।
जावा में फ्लैश सॉर्ट class FlashSort { static int n; static int m; static int[] a; static int[] l; public static void flashSort(int size) { n = size; generateRandomArray(); long start = System.currentTimeMillis(); partialFlashSort(); long mid = System.currentTimeMillis(); insertionSort(); long end = System.currentTimeMillis();
अनुमानित क्रमबद्ध :: प्रोक्सैम्प सॉर्ट
यह छँटाई यहाँ वर्णित लोगों में सबसे पुरानी है, इसे 1980 में कैलिफोर्निया विश्वविद्यालय के प्रोफेसर थॉमस स्टैंडिश ने पेश किया था। दिखने में, यह काफी भिन्न प्रतीत होता है, लेकिन यदि आप बारीकी से देखते हैं, तो सब कुछ समान है।
एल्गोरिथ्म इस तरह की अवधारणा को
हिट के रूप में संचालित करता है - एक निश्चित संख्या जो कि सरणी के कुछ तत्व के मूल्य के करीब है।
यह निर्धारित करने के लिए कि एक सरणी तत्व हिट है, एक
सन्निकटन फ़ंक्शन तत्व पर लागू होता है।
प्रोफ़ेसर स्टैंडिश ने वास्तविक संख्याओं के एरेज़ को हल किया। सन्निकटन कार्य वास्तविक संख्याओं को पूर्णांक से नीचे करना था।
उदाहरण के लिए, यदि सरणी में तत्व 2.8, 2, 2.1, 2.6 आदि हैं। फिर इन नंबरों के लिए एक हिट हो जाएगा।
सामान्य प्रक्रिया:
- हम प्रत्येक तत्व के लिए एक अनुमानित फ़ंक्शन लागू करते हैं, यह निर्धारित करते हैं कि कौन सा हिट अगले तत्व से मेल खाता है।
- इस प्रकार, प्रत्येक हिट के लिए, हम इस हिट के अनुरूप तत्वों की संख्या की गणना कर सकते हैं।
- सभी हिट के लिए तत्वों की संख्या को जानते हुए, हम सरणी में हिट्स (बाईं ओर की सीमाओं) का स्थानीयकरण निर्धारित करते हैं।
- हिट के स्थानीयकरण को जानने के बाद, हम प्रत्येक तत्व के स्थानीयकरण का निर्धारण करते हैं।
- तत्व के स्थानीयकरण को निर्धारित करने के बाद, हम इसे सरणी में इसके स्थान पर सम्मिलित करने का प्रयास करते हैं। यदि जगह पहले से ही ली गई है, तो हम पड़ोसियों को तत्व के लिए जगह बनाने के लिए दाईं ओर (यदि तत्व उनसे छोटा है) स्थानांतरित करते हैं। या दाईं ओर हम तत्व को स्वयं सम्मिलित करते हैं (यदि यह पड़ोसियों से अधिक है)।
एक अनुमानित कार्य के रूप में, आप सरणी में डेटा की सामान्य प्रकृति के आधार पर किसी को भी असाइन कर सकते हैं। इस छँटाई के आधुनिक कार्यान्वयन में, हिट आमतौर पर आंशिक भाग को बंद करके नहीं, बल्कि हमारे पसंदीदा सूत्र का उपयोग करके निर्धारित किया जाता है।
जावास्क्रिप्ट सन्निकटन प्रकार Array.prototype.ProxmapSort = function() { var start = 0; var end = this.length; var A2 = new Array(end); var MapKey = new Array(end); var hitCount = new Array(end); for(var i = start; i < end; i++) {hitCount[i] = 0;} var min = this[start]; var max = this[start]; for (var i = start+1; i < end; i++){ if (this[i] < min) { min = this[i]; } else { if(this[i] > max) {max = this[i];} } }
हैश सॉर्ट प्रविष्टि सॉर्टिंग :: हैश सॉर्ट
खैर, हम 6 साल पहले
सुझाए गए एल्गोरिथम के साथ हमारी समीक्षा को समाप्त कर देंगे। यह एक हाइब्रिड एल्गोरिथ्म है, जिसमें वितरण और आवेषण के अलावा, विलय को भी जोड़ा जाता है।
- सरणी को पुनरावर्ती रूप से आधा में विभाजित किया गया है, जब तक कि कुछ कदम पर अर्ध-उप-आकार का आकार न्यूनतम आकार तक नहीं पहुंच जाता है (लेखक के पास 500 से अधिक तत्व नहीं हैं)।
- सबसे कम पुनरावर्तन स्तर पर, प्रत्येक अर्ध-उप-श्रेणी में एक परिचित एल्गोरिथ्म लागू होता है - एक ही सूत्र का उपयोग करते हुए, उप-श्रेणी के अंदर एक अनुमानित वितरण होता है, स्थानीय अनसोल्ड अनुभागों के आवेषण द्वारा छँटाई के साथ।
- सबरेज़ के दो हिस्सों की व्यवस्था के बाद, वे विलय कर देते हैं।
- बिंदु 3 (सॉर्ट किए गए हिस्सों-उप-मर्जों के विलय) को दोहराया जाता है, जब पुनरावृत्ति के स्तर को बहुत ऊपर तक ले जाया जाता है, जब मूल सरणी दो हिस्सों से संयुक्त होती है।
जावा में हैश प्रविष्टि द्वारा सॉर्ट करें import java.util.Arrays; import java.util.Date; import java.util.Random; public class HashSort {
सूत्र को ही हैश फ़ंक्शन कहा जाता है, और अनुमानित वितरण के लिए सहायक सरणी को हैश तालिका कहा जाता है।
संदर्भ
इंटरपोलेशन और हिस्टोग्राम ,
फ्लैश ,
प्रॉक्समैप
सोलोमन ,
हैश टेबल ,
फ्लैशश्रृंखला लेख:
अलोग्लाब एक्सेल एप्लिकेशन (इस मामले में, प्रारंभिक अनारक्षित सरणी में, यादृच्छिक अंश भाग को पूर्णांक में जोड़ा जाता है) में लगभग छंटनी दिखाई दी। सुलैमान और फ्लैश एक लंबे समय के लिए रहे हैं, लेकिन अभी तक प्रक्षेप, हैश और एक हिस्टोग्राम लागू नहीं किया है।