簡體   English   中英

計數排序算法的變化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM