首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的Heapsort

Python中的Heapsort
EN

Code Review用户
提问于 2016-01-30 12:34:51
回答 3查看 870关注 0票数 5

请查看Python中Heapsort的以下就地实现:

代码语言:javascript
复制
def heapsort(l):
    def plunge(l, i, n):
        lchild = 2 * i + 1
        while lchild < n:
            rchild = lchild + 1
            if rchild < n and l[lchild] < l[rchild]:
                child = rchild
            else:
                child = lchild

            if l[i] > l[child]: break

            l[i], l[child] = l[child], l[i]
            i, lchild = child, 2 * child + 1

    for i in range(len(l) // 2, -1, -1):
        plunge(l, i, len(l))

    for i in range(len(l) - 1, -1, -1):
        l[0], l[i] = l[i], l[0]
        plunge(l, 0, i)
EN

回答 3

Code Review用户

回答已采纳

发布于 2016-02-02 18:39:19

您的代码大多是好的,只有小的改进是可能的:

使用条件表达式代替语句

一个条件语句(如您使用的语句)可能执行两个完全不同的分支,而条件表达式只能返回一个值。这稍微简化和缩短了代码:

代码语言:javascript
复制
if rchild < n and l[lchild] < l[rchild]:
    child = rchild
else:
    child = lchild

变成:

代码语言:javascript
复制
child = rchild if rchild < n and l[lchild] < l[rchild] else lchild

要清楚地表明,您只是在决定child的值应该是什么,而不是其他任何东西。

给公共论点起了很好的名字

l只有一个字母长,很容易与1混淆,至少在小字体大小下是如此。形式参数名称是文档的第一种形式,但是应该给出。例如,我建议使用list_xs ( FP约定)。

编写了一个额外的助手:heapify

维基百科和罗塞塔代码都使用了heapify助手,将其写入您的代码将使其更加可读性,使其类似于这些描述。

另外,附加函数将更清楚地表明,首先要创建堆,然后从堆中提取元素开始实际的排序列表构造。

票数 1
EN

Code Review用户

发布于 2016-02-02 17:37:07

详情:

成语

sift_down似乎是一个比plunge更常见的名字。使用常用的词汇可能是个不错的选择。

反向环

可能是个人喜好,但我发现range(len(l) - 1, -1, -1)一开始很难理解,我宁愿读reversed(range(len(l)))

票数 1
EN

Code Review用户

发布于 2016-02-02 19:10:01

代码语言:javascript
复制
        rchild = lchild + 1
        if rchild < n and l[lchild] < l[rchild]:
            child = rchild
        else:
            child = lchild

这引起了我的注意,因为rchild只在这里使用过。如果我们内联它,然后看看我们是否可以不同地重构它呢?

代码语言:javascript
复制
if lchild + 1 < n and l[lchild] < l[lchild+1]:
    child = lchild + 1
else:
    child = lchild

...is笔直的衬里.所以现在重构:

代码语言:javascript
复制
child = lchild
if lchild + 1 < n and l[lchild] < l[lchild+1]:
    child += 1

或者倒转:

代码语言:javascript
复制
child = lchild + 1 # see if right child is usable
if child >= n or l[lchild] >= l[child]:
    # not usable, fall back to left child
    child = lchild

..which把我带到我的下一个评论:你缺乏评论。就像选择好的名字一样,评论可以填补空白,从总结的角度阐明为什么要做一些事情,因为代码本身解释了正在做的事情。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/118352

复制
相关文章

相似问题

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