【发布时间】:2012-03-05 15:36:17
【问题描述】:
我意识到这不是 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)。
【问题讨论】:
-
是什么让您认为这不是计数排序?这对我来说看起来完全有效。
-
是的,我也没有发现问题。 FWIW,您甚至不需要映射来处理负数 - 只需创建一个足够大的
count_array来容纳它们,然后让负索引环绕。 -
不使用内置
max()的特殊原因? -
谢谢大家的回答。请参阅上面的编辑,了解为什么我认为这不是标准计数排序。 @RikPoggi - 我是 Python 新手; max(array) 似乎好多了,谢谢!我已经调整了原始代码。
-
这个答案有一种pythonic方式来删除你的内部for循环(看看结果是如何扩展的:stackoverflow.com/questions/8775963/…