首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python语法/理解

Python语法/理解
EN

Stack Overflow用户
提问于 2013-11-08 01:29:54
回答 3查看 102关注 0票数 2
代码语言:javascript
复制
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行标记的行。可能是因为我对蟒蛇不熟悉,或者只是个傻瓜。

  1. 第一个案子发生了什么?什么时候范围是?“对于空数组范围内的每一个c.?
  2. 我也不让array[i] = a接电话。如果a是计数数组中可能为零的第一个元素,那么如何添加它?真的很困惑..。

干杯!

EN

回答 3

Stack Overflow用户

发布于 2013-11-08 01:37:17

显然,您已经知道count[a]将为0,因此range(count[a])将是[]

所以,你要问的是,这是做什么的:

代码语言:javascript
复制
for i in []:
   do_stuff(i)

答案是,它在每一个0元素上循环-换句话说,它根本不循环。它什么都不做*

这在 statement的docs中有解释。

…然后对迭代器…提供的每个项执行一次套件。当项目耗尽时(当序列为空时),即为)。…循环终止。

这就间接地解释了你第二次困惑的原因:

如果a是计数数组中可能为零的第一个元素,那么如何添加它?

count[a]为0时,您将永远不会进入循环,因此这种情况永远不会出现。

*如果for语句有一个else子句,那么它将运行else子句。

票数 1
EN

Stack Overflow用户

发布于 2013-11-08 01:35:10

  1. range将为您提供一个具有指定开始值和结束值的列表。例如 打印范围(5) 将打印 0,1,2,3,4 当您说,range(m)range(count[a])时,它将生成一个列表,直到mcount[a]从0开始。
  2. 关于array[i] = arange(m)中,对于每个元素,代码检查count[a]。如果count[a]为0,则不会执行第二个循环。(range(0)将生成一个空列表),因此,当a为0时,将不会执行array[i] = a
票数 0
EN

Stack Overflow用户

发布于 2013-11-08 01:47:26

我简化了你的部分代码,也许它能帮助你很好地理解算法的核心。在对数组中的所有元素进行计数之后,我们只能使用存储在count[]中的信息来重构排序的数组。

代码语言:javascript
复制
array=[]
for a in range(m): 
    array.extend([a]*count[a])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19850024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档