2010-04-12 10 views
7

की सॉर्ट सरणी यदि आकार एन की एक सरणी में केवल 3 मान 0, 1 और 2 (किसी भी बार दोहराया गया है) उन्हें सॉर्ट करने का सबसे अच्छा तरीका क्या है। सबसे अच्छा जटिलता इंगित करता है। स्थान और समय जटिलता दोनोंआकार एन

+0

क्या सबसे अच्छा है इस मामले में मतलब है? – EvilTeach

+0

यह निर्भर करता है कि आपका क्या मतलब है "सर्वश्रेष्ठ" - सबसे सुविधाजनक? सबसे तेज़ भंडारण के मामले में सबसे कुशल? सबसे पोर्टेबल? –

उत्तर

24

पर विचार प्रत्येक संख्या का आवृत्तियां गणना और बाद में सही मायने रखता है के साथ सरणी को भरने, इस O(n)

+0

उर्फ ​​गणना क्रमबद्ध करें: http://en.wikipedia.org/wiki/Counting_sort –

+0

उर्फ ​​कबूतर प्रकार, उर्फ ​​रेडिक्स सॉर्ट। – falstro

+0

@ एंड्रियास एन का मान शांत हो सकता है इसलिए कुछ मामलों में गिनती थोड़ा परेशानी हो सकती है –

3

ध्वनि डिज्कस्ट्रा के डच राष्ट्रीय ध्वज समस्या की तरह एक बहुत कुछ है।

आप एक समाधान है कि उनकी गिनती का उपयोग नहीं करता की जरूरत है, बाहर की जाँच http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Flag/

2

Untested सी शैली समाधान:

int count[3] = {0, 0, 0}; 

for (int i = 0; i < n; ++i) 
    ++count[array[i]]; 

int pos = 0; 
for (int c = 0; c < 3; ++c) 
    for (int i = array[c]; i; --i) 
     array[pos++] = c; 
+2

'हस्ताक्षरित' या 'size_t' अधिक उपयुक्त होगा। – GManNickG

1

हास्केल दो लाइनर:

count xs = Map.toList $ Map.fromListWith (+) [ (x, 1) | x <- xs ] 

countingSort xs = concatMap (\(x, n) -> replicate n x) (count xs) 

> countingSort [2,0,2,1,2,2,1,0,2,1] 
[0,0,1,1,1,2,2,2,2,2] 
संबंधित मुद्दे