गिनती क्रम

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

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

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

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

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

फ़ंक्शन काउंटिंग सॉर्ट (इनपुट, k) गिनती ← k + 1 शून्य की सरणी आउटपुट ← इनपुट के समान लंबाई की सरणी i = 0 से लंबाई (इनपुट) - 1 के लिए j = कुंजी(इनपुट[i]) गिनती[जे] = गिनती[जे] + 1 i = 1 से k के लिए करें गिनती[मैं] = गिनती[मैं] + गिनती[मैं - 1] i के लिए = लंबाई(इनपुट) - 1 से 0 तक करें j = कुंजी(इनपुट[i]) गिनती[जे] = गिनती[जे] - 1 आउटपुट[गिनती[जे = इनपुट[आई] वापसी आउटपुट

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

संक्षेप में, एल्गोरिथ्म पहले लूप में आइटमों पर लूप करता है, प्रत्येक कुंजी के भीतर होने वाली संख्या के हिस्टोग्राम की गणना करता है  संग्रह। उसके बाद दूसरे लूप में, यह एक उपसर्ग योग गणना करता है   यह निर्धारित करने के लिए, प्रत्येक कुंजी के लिए, वह स्थिति सीमा जहां उस कुंजी वाले आइटम रखे जाने चाहिए; यानी कुंजी के आइटम $$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