首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用递归的选择排序

使用递归的选择排序
EN

Code Review用户
提问于 2011-06-07 18:34:22
回答 1查看 5.6K关注 0票数 4

对于这里的每个人来说,这种递归选择排序是什么样子的?我是不是错过了任何关于我所做的事情的“奏鸣曲”?

代码语言:javascript
复制
def selection_sort(li, out=None):
    if out is None:
        out = []    
        li = li[:]

    if len(li) == 0:
        return out

    small = min(li)
    li.remove(small)
    out.append(small)
    return selection_sort(li, out)
EN

回答 1

Code Review用户

发布于 2011-06-07 19:06:23

代码语言:javascript
复制
def selection_sort(li, out=None):

我不喜欢“李”这个名字,我认为缩写是不好的。

代码语言:javascript
复制
    if out is None:
        out = []    
        li = li[:]

我建议创建一个独立的内部函数,而不是使用out参数。否则,函数的调用方可能会合理地传递=某样东西,而它只打算在内部使用。

代码语言:javascript
复制
    if len(li) == 0:
        return out

最好使用if not li:

代码语言:javascript
复制
    small = min(li)
    li.remove(small)
    out.append(small)
    return selection_sort(li, out)

要评估这段代码有点困难,因为您正在做两件不应该做的事情,在没有必要时使用递归,并实现自己的排序例程。但如果你这样做是为了学习的目的,那也没关系。

编辑

迭代解决方案:

代码语言:javascript
复制
def selection_sort(li):
    li = li[:]
    out = []

    while li:
        smallest = min(li)
        li.remove(smallest)
        out.append(smallest)

    return out

但是,为什么这比递归解决方案更好:

  1. 堆栈空间是有限制的。如果您尝试使用这个函数对一个大列表排序,您将得到一个RuntimeError
  2. 调用函数有额外的开销,循环中的迭代不会,迭代版本会更快。
  3. 循环通常比递归更容易阅读。while循环可以很容易地看到所做的事情,而递归版本则需要对代码进行一些思考才能看到逻辑。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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