गिनती क्रम

अभिकलित्र विज्ञान में, काउंटिंग सॉर्ट, छोटे सकारात्मक पूर्णांक वाली कुंजियों के अनुसार वस्तुओं के संग्रह को सॉर्ट करने के लिए एक कलन विधि है; अर्थात्, यह एक पूर्णांक प्रवरण कलन विधि है। यह उन वस्तुओं की संख्या की गणना करके संचालित होता है जिनमें अलग-अलग कुंजी मान होते हैं, और आउटपुट अनुक्रम में प्रत्येक कुंजी मान की स्थिति निर्धारित करने के लिए उन गणनाओं पर उपसर्ग योग लागू करते हैं। इसका चलने का समय वस्तुओं की संख्या और अधिकतम कुंजी मान और न्यूनतम कुंजी मान के बीच अंतर में रैखिक है, इसलिए यह केवल उन स्थितियों में सीधे उपयोग के लिए उपयुक्त है जहां कुंजियों में भिन्नता वस्तुओं की संख्या से काफी अधिक नहीं है। इसे अधिकांशत: एक सबरूटीन के रूप में उपयोग किया जाता है, यह एक अन्य प्रवरण कलन विधि है, जो बड़ी कुंजियों को अधिक कुशलता से संभाल सकता है। गिनती का प्रकार तुलनात्मक प्रकार नहीं है; यह किसी सरणी में अनुक्रमणिका के रूप में मुख्य मानों का उपयोग करता है $Ω(n log n)$ तुलना प्रवरण के लिए निचली सीमा लागू नहीं होगी। बकट सॉर्ट का उपयोग गिनती सॉर्ट के बदले में किया जा सकता है, और इसमें समान समय विश्लेषण सम्मलित होता है। चूंकि, काउंटिंग सॉर्ट की तुलना में, बकेट सॉर्ट के लिए प्रत्येक बकेट के भीतर वस्तुओं के सेट को रखने के लिए लिंक की गई सूचियों, गतिशील सरणियों या पूर्व-आवंटित मेमोरी की एक बड़ी मात्रा की आवश्यकता होती है, जबकि काउंटिंग सॉर्ट प्रति बकट एक एकल संख्या (आइटमों की गिनती) को संग्रहीत करता है।.

इनपुट और आउटपुट धारणाएँ
सबसे सामान्य स्थितिे में, काउंटिंग सॉर्ट के इनपुट में n आइटमों का एक संग्रह होता है, जिनमें से प्रत्येक में एक गैर-नकारात्मक पूर्णांक कुंजी होती है जिसका अधिकतम मान अधिकतम k होता है। गिनती क्रम के कुछ विवरणों में, क्रमबद्ध किए जाने वाले इनपुट को पूर्णांकों का एक अनुक्रम मात्र माना जाता है, लेकिन यह सरलीकरण गिनती के कई अनुप्रयोगों को समायोजित नहीं करता है। उदाहरण के लिए, जब रेडिक्स सॉर्ट में एक सबरूटीन के रूप में उपयोग किया जाता है, तो प्रत्येक कॉल के लिए काउंटिंग सॉर्ट की कुंजियाँ बड़ी आइटम कुंजियों के अलग-अलग अंक होती हैं; केवल आइटमों से अलग किए गए मुख्य अंकों की क्रमबद्ध सूची लौटाना पर्याप्त नहीं होगा।

रेडिक्स सॉर्ट जैसे अनुप्रयोगों में, अधिकतम कुंजी मान पर एक सीमा होती है $k$ पहले से ज्ञात होगा, और इसे कलन विधि के इनपुट का हिस्सा माना जा सकता है। चूंकि, यदि $k$ का मान पहले से ज्ञात नहीं है तो इसकी गणना, पहले चरण के रूप में, अधिकतम कुंजी मान निर्धारित करने के लिए डेटा पर एक अतिरिक्त लूप द्वारा की जा सकती है।

आउटपुट उनकी कुंजियों द्वारा क्रमित तत्वों की एक ऐरे डेटा संरचना है। रेडिक्स प्रवरण के लिए इसके अनुप्रयोग के कारण, गिनती सॉर्ट एक स्थिर सॉर्ट होना चाहिए; अर्थात्, यदि दो तत्व एक ही कुंजी साझा करते हैं, तो आउटपुट सरणी में उनका सापेक्ष क्रम और इनपुट सरणी में उनका सापेक्ष क्रम मेल खाना चाहिए।

छद्मकोड
छद्मकोड में, कलन विधि को इस प्रकार व्यक्त किया जा सकता है:

function CountingSort(input, k) count ← array of k + 1 zeros output ← array of same length as input for i = 0 to length(input) - 1 do j = key(input[i]) count[j] = count[j] + 1 for i = 1 to k do count[i] = count[i] + count[i - 1] for i = length(input) - 1 down to 0 do j = key(input[i]) count[j] = count[j] - 1 output[count[j]] = input[i]

return output यहाँ  सॉर्ट किया जाने वाला इनपुट ऐरे है,   इनपुट सरणी में प्रत्येक आइटम की संख्यात्मक कुंजी लौटाता है,   एक सहायक सरणी है जिसका उपयोग पहले प्रत्येक कुंजी के साथ आइटमों की संख्या को संग्रहीत करने के लिए किया जाता है, और फिर (दूसरे लूप के बाद) उन स्थितियों को संग्रहीत करने के लिए किया जाता है जहां प्रत्येक कुंजी के साथ आइटम रखे जाने चाहिए, गैर-नकारात्मक कुंजी मानों का अधिकतम मान है और  क्रमबद्ध आउटपुट सरणी है।

संक्षेप में, कलन विधि पहले लूप में आइटमों पर लूप करता है, प्रत्येक कुंजी के भीतर होने वाली संख्या के हिस्टोग्राम की गणना करता है  संग्रह, उसके बाद दूसरे लूप में, यह एक उपसर्ग योग गणना करता है   यह निर्धारित करने के लिए, प्रत्येक कुंजी के लिए, वह स्थिति सीमा जहां उस कुंजी वाले आइटम रखे जाने चाहिए; अर्थात कुंजी के आइटम $$i$$ प्रारंभिक स्थिति में रखा जाना चाहिए. अंत में, तीसरे लूप में, यह के आइटम्स पर लूप करता है  फिर से, लेकिन उल्टे क्रम में, प्रत्येक आइटम को उसकी क्रमबद्ध स्थिति में ले जाना   सरणी है।

समान कुंजियों वाली वस्तुओं का सापेक्ष क्रम यहां संरक्षित है; अर्थात, यह एक :श्रेणी:स्थिर प्रकार है।

जटिलता विश्लेषण
क्योंकि कलन विधि केवल सरल फॉर लूप का उपयोग करता है, रिकर्सन या सबरूटीन कॉल के बिना, इसका विश्लेषण करना सीधा है। गिनती सरणी का आरंभीकरण, और दूसरा लूप के लिए जो गिनती सरणी पर एक उपसर्ग योग करता है, प्रत्येक अधिकतम k + 1 बार पुनरावृत्त होता है और इसलिए O(k) समय लेता है। लूप के लिए अन्य दो, और आउटपुट ऐरे का आरंभीकरण, प्रत्येक O(n) समय लेता है। इसलिए, संपूर्ण कलन विधि का समय इन चरणों के समय का योग है, $O(n + k)$ है।

क्योंकि यह लंबाई k + 1 और n के सरणियों का उपयोग करता है, एल्गोरिथ्म का कुल स्थान उपयोग भी O(n + k) है। समस्या के उदाहरणों के लिए जिसमें अधिकतम कुंजी मान आइटमों की संख्या से काफी छोटा है, गिनती सॉर्ट अत्यधिक स्थान-कुशल हो सकता है, क्योंकि इसके इनपुट और आउटपुट एरे के अतिरिक्त यह एकमात्र स्टोरेज काउंट एरे है जो समष्टि $O(k)$ का उपयोग करता है।

संस्करण कलन विधि
यदि क्रमबद्ध किया जाने वाला प्रत्येक आइटम स्वयं एक पूर्णांक है, और कुंजी के रूप में भी उपयोग किया जाता है, तो गिनती क्रम के दूसरे और तीसरे लूप को जोड़ा जा सकता है; दूसरे लूप में, उस स्थिति की गणना करने के अतिरिक्त जहां कुंजी वाले आइटम हैं  आउटपुट में रखा जाना चाहिए, बस जोड़ें   संख्या की प्रतियां   आउटपुट के लिए है।

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

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

इतिहास
चूंकि मूलांक प्रवरण का इतिहास बहुत पुराना है, काउंटिंग सॉर्ट, और रेडिक्स प्रवरण के लिए इसका अनुप्रयोग, दोनों का आविष्कार 1954 में हेरोल्ड एच. सीवार्ड द्वारा किया गया था।

बाहरी संबंध

 * Counting Sort html5 visualization
 * Demonstration applet from Cardiff University