[英]Python syntax / understanding
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行。 可能是因为我是python的新手,还是愚蠢。
array[i] = a
。 如果a是计数数组中的第一个元素(可能为零),如何将其添加....? 真的很困惑... 干杯!
您显然已经发现count[a]
将为0,因此range(count[a])
将为[]
。
因此,您要问的是,这是做什么的:
for i in []:
do_stuff(i)
答案是,它循环遍历0个元素中的每个元素-换句话说,它根本不循环。 它什么都不做。*
……然后对迭代器提供的每个项目执行一次套件…… 当项目用尽时(当序列为空时立即…) ……循环终止。
这隐含地解释了您的第二点困惑:
如果a是计数数组中的第一个元素(可能为零),如何将其添加
当count[a]
为0时,您将永远不会进入循环,因此永远不会出现这种情况。
*如果for
语句具有else
子句,则它将运行else
子句。
range
将为您提供指定的开始和结束值的列表。 例如
print 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
将不会执行。
我简化了部分代码,也许它可以帮助您很好地理解算法的核心。 在对数组中的所有元素进行计数之后,我们只能使用存储在count[]
的信息来重建排序后的数组。
array=[]
for a in range(m):
array.extend([a]*count[a])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.