[英]Variation of the counting sort algorithm?
我意識到這不是CLRS中所述的標准計數排序,但是我的簡化版本缺少標准計數排序有什么? 我意識到我的只對正整數排序,但是應該很容易進行調整(通過使用地圖)。
def count_sort(array):
maximum = max(array)
minimum = min(0, min(array))
count_array = [0]*(maximum-minimum+1)
for val in array:
count_array[val] += 1
sorted_array = []
for i in range(minimum, maximum+1):
if count_array[i] > 0:
for j in range(0, count_array[i]):
sorted_array.append(i)
return sorted_array
array = [3,2,-1,1,5,0,10,18,25,25]
print array
print count_sort(array)
編輯:之所以我認為這不是標准的計數方式,是因為MIT OpenCourseware講座中介紹的算法似乎更復雜(http://youtu.be/0VqawRl3Xzs?t=34m54s)。
您的最小和最大數值有些奇怪。 嘗試這個:
def count_sort(array):
maximum = max(array)
minimum = min(array)
count_array = [0]*(maximum-minimum+1)
for val in array:
count_array[val-minimum] += 1
sorted_array = []
for i in range(minimum, maximum+1):
if count_array[i-minimum] > 0:
for j in range(0, count_array[i-minimum]):
sorted_array.append(i)
print sorted_array
array = [3,2,-1,1,5,0,10,18,25,25]
print array
count_sort(array)
我看不出您進行計數排序的方式有任何問題,無論如何,我想到的一些代碼建議可能會讓您感興趣。
例如一行:
minimum = min(0, min(array))
可以替換為:
minimum = min(0, *array)
如果您在python-2.x中運行代碼,請使用xrange()
而不是range()
,因此可以更改:
for i in range(minimum, maximum+1):
有:
for i in xrange(minimum, maximum+1):
對於最后一個循環,您實際上根本不需要range()
,請檢查pythonic方法執行N次操作的問題 ,因此您可以更改:
for j in range(0, count_array[i]):
sorted_array.append(i)
有:
for _ in itertools.repeat(None, count_array[i]):
sorted_array.append(i)
您是說http://en.wikipedia.org/wiki/Counting_sort嗎?
如果是,那么它幾乎與您的代碼相似。 但它有一個改進:“在這里保留了具有相同鍵的項的相對順序,即,這是一種穩定的排序。” 因此,如果您對鍵值字典進行排序,則在鍵值相等的情況下,值的順序將保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.