我意识到这不是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)。
答案 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吗?
如果是,它几乎与您的代码相似。但它有一个改进:“这里保留了具有相同键的项目的相对顺序,即这是一种稳定的排序。”因此,如果要对键值字典进行排序,则如果它们具有相同的键,则值将保持不变。