def counting_sort(array, maxval):
"""in-place counting sort"""
m = maxval + 1
count = [0] * m # init with zeros
for a in array:
count[a] += 1 # count occurences
i = 0
for a in range(m): # emit
for c in range(count[a]): # - emit 'count[a]' copies of 'a' #CONFUSED
array[i] = a
i += 1
return array
print counting_sort( [1, 4, 7, 2, 1, 3, 2, 1, 4, 2, 3, 2, 1], 7 )
# prints: [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 4, 7]因此,在上面的代码中,我不理解我在最后一个代码之前用困惑的4行标记的行。可能是因为我对蟒蛇不熟悉,或者只是个傻瓜。
array[i] = a接电话。如果a是计数数组中可能为零的第一个元素,那么如何添加它?真的很困惑..。干杯!
发布于 2013-11-08 01:37:17
显然,您已经知道count[a]将为0,因此range(count[a])将是[]。
所以,你要问的是,这是做什么的:
for i in []:
do_stuff(i)答案是,它在每一个0元素上循环-换句话说,它根本不循环。它什么都不做*
这在 statement的docs中有解释。
…然后对迭代器…提供的每个项执行一次套件。当项目耗尽时(当序列为空时),即为)。…循环终止。
这就间接地解释了你第二次困惑的原因:
如果a是计数数组中可能为零的第一个元素,那么如何添加它?
当count[a]为0时,您将永远不会进入循环,因此这种情况永远不会出现。
*如果for语句有一个else子句,那么它将运行else子句。
发布于 2013-11-08 01:35:10
range将为您提供一个具有指定开始值和结束值的列表。例如
打印范围(5)
将打印
0,1,2,3,4
当您说,range(m)或range(count[a])时,它将生成一个列表,直到m或count[a]从0开始。array[i] = a
在range(m)中,对于每个元素,代码检查count[a]。如果count[a]为0,则不会执行第二个循环。(range(0)将生成一个空列表),因此,当a为0时,将不会执行array[i] = a。发布于 2013-11-08 01:47:26
我简化了你的部分代码,也许它能帮助你很好地理解算法的核心。在对数组中的所有元素进行计数之后,我们只能使用存储在count[]中的信息来重构排序的数组。
array=[]
for a in range(m):
array.extend([a]*count[a])https://stackoverflow.com/questions/19850024
复制相似问题