मान पूर्णांक दृश्यों के लिए एक उदाहरण के लिए रेंज 0 में हैं। क्रम अस्थिर है। हालांकि यह मोहित द्वारा प्रदान की जवाब के रूप में के रूप में संक्षिप्त नहीं है, यह मामूली तेजी उनके सही डिब्बे में पहले से ही तत्व लंघन द्वारा (समय asymptotically एक ही है) (सामान्य मामले में जहां कश्मीर < < n के लिए) है। प्रैक्टिस में मैं मोहित के अपने कड़े, सरल लूप के लिए पसंद करता हूं।
def sort_inplace(seq):
min_ = min(seq)
max_ = max(seq)
k = max_ - min_ + 1
stop = [0] * k
for i in seq:
stop[i - min_] += 1
for j in range(1, k):
stop[j] += stop[j - 1]
insert = [0] + stop[:k - 1]
for j in range(k):
while insert[j] < stop[j] and seq[insert[j]] == j + min_:
insert[j] += 1
tmp = None
for j in range(k):
while insert[j] < stop[j]:
tmp, seq[insert[j]] = seq[insert[j]], tmp
while tmp is not None:
bin_ = tmp - min_
tmp, seq[insert[bin_]] = seq[insert[bin_]], tmp
while insert[bin_] < stop[bin_] and seq[insert[bin_]] == bin_ + min_:
insert[bin_] += 1
एक तंग पाश के साथ
लेकिन अभी भी लंघन पहले से ही दूसरी जगह तत्वों:
def dave_sort(seq):
min_ = min(seq)
max_ = max(seq)
k = max_ - min_ + 1
stop = [0] * k
for i in seq:
stop[i - min_] += 1
for i in range(1, k):
stop[i] += stop[i-1]
insert = [0] + stop[:k - 1]
for meh in range(0, k - 1):
i = insert[meh]
while i < stop[meh]:
bin_ = seq[i] - min_
if insert[bin_] > i:
tmp = seq[insert[bin_]]
seq[insert[bin_]] = seq[i]
seq[i] = tmp
insert[bin_] += 1
else:
i += 1
संपादित करें: अतिरिक्त बिट के साथ अजगर में मोहित के दृष्टिकोण तरह की स्थिरता पर प्रभाव सत्यापित करने के लिए।
from collections import namedtuple
from random import randrange
KV = namedtuple("KV", "k v")
def mohit_sort(seq, key):
f = lambda v: getattr(v, key)
keys = map(f, seq)
min_ = min(keys)
max_ = max(keys)
k = max_ - min_ + 1
insert = [0] * k
for i in keys:
insert[i - min_] += 1
insert[0] -= 1
for i in range(1, k):
insert[i] += insert[i-1]
i = 0
n = len(seq)
while i < n:
bin_ = f(seq[i])
if insert[bin_] > i:
seq[i], seq[insert[bin_]] = seq[insert[bin_]], seq[i]
i -= 1
insert[bin_] -= 1
i += 1
def test(n, k):
seq = []
vals = [0] * k
for _ in range(n):
key = randrange(k)
seq.append(KV(key, vals[key]))
vals[key] += 1
print(seq)
mohit_sort(seq, "k")
print(seq)
if __name__ == "__main__":
test(20, 3)
अनुभाग देखें [Variant एल्गोरिदम] (http://en.wikipedia.org/wiki/Counting_sort#Variant_algorithms) विकिपीडिया प्रविष्टि (पिछले पैराग्राफ) में। – nwellnhof
'' "आप इनपुट सरणी के बाहर हे (के) भंडारण का उपयोग कर सकते" - बस एक नियमित रूप से गिनती तरह है, जो शायद "जगह में" के कुछ विकृत परिभाषा में गिर जाता है जैसा लगता है। तुम भी कुछ जोड़ा जटिलता के साथ यथा-स्थान तरह सही मायने में गिनती कर सकते हैं (यह मानते हुए कश्मीर <= एन) की गिनती के लिए प्रत्यावर्तन और ऋणात्मक मानों का उपयोग कर, लेकिन तकनीकी रूप ढेर अंतरिक्ष बुरी से बुरी हालत हे (एन) हो सकता है, तो यह है कि वास्तव में नहीं है काम। बहुत निश्चित गिनती प्रकार स्थिर नहीं हो सकता है। – Dukeling
हम जरूरत O (n + k) एक नियमित रूप से गिनती sort.The विकी बस ऊपर दिए गए लिंक के भंडारण कहा गया है कि 'अपनी तरह इतना है कि यह जगह में किया जा सकता है गिनती संशोधित करने के लिए संभव' लेकिन कोई जानकारी इसे कैसे करना है !! – Roronoa