计数排序算法的变化?

时间:2012-02-14 08:51:38

标签: python algorithm sorting

我意识到这不是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)

编辑:之所以我认为这不是标准计数排序,是因为麻省理工学院开放式课程讲座中涉及的算法似乎有点涉及(http://youtu.be/0VqawRl3Xzs? T = 34m54s)。

3 个答案:

答案 0 :(得分:2)

你用你的最小值和最大值做了一些奇怪的事情。试试这个:

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)

答案 1 :(得分:0)

我没有看到你计算排序方式的问题,无论如何,你的代码会想到一些可能让你感兴趣的建议。

例如行:

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 way to do something N times,以便更改:

for j in range(0, count_array[i]):
    sorted_array.append(i)

使用:

for _ in itertools.repeat(None, count_array[i]):
    sorted_array.append(i)

答案 2 :(得分:-1)

您的意思是http://en.wikipedia.org/wiki/Counting_sort吗?

如果是,它几乎与您的代码相似。但它有一个改进:“这里保留了具有相同键的项目的相对顺序,即这是一种稳定的排序。”因此,如果要对键值字典进行排序,则如果它们具有相同的键,则值将保持不变。