【问题标题】:recursively sorting a list using min() [duplicate]使用 min() 递归排序列表 [重复]
【发布时间】:2022-01-04 05:04:49
【问题描述】:
def sort(L,Lsorted):

    if len(L)==1:
        return Lsorted.append(L[0])
    a = min(L)
    Lsorted.append(a)
    L.remove(a)
    return sort(L,Lsorted)

这个想法是每次删除 L 的最小元素并附加到另一个列表,然后最后返回另一个列表。

当我这样做时,此代码返回 None:

if __name__=='__main__':
    L = [9,1,11]
    L1 = []
    print(sort(L,L1))

【问题讨论】:

  • 哎呀我的算法复杂度。虽然append 是摊销常数,但min 和remove 都是线性的,并且由于您反复调用它们,因此变成O(n²)。假设栈没有先溢出。
  • 当您可以简单地从现有列表创建一个新列表,然后按您需要的任何方向对其进行排序时,这些操作的意义是什么。如我错了请纠正我。除非它不是关于自我训练。
  • 如果你刻意研究排序,看看:heapsort(最简单,但不稳定),mergesort(简单,但需要额外内存),quicksort(通常最快,但最坏情况非常糟糕) ; 不稳定);插入排序(二次,但它对于小列表来说是一个如此小的常数因子),选择排序(二次,与您正在尝试的内容模糊相似),冒泡排序(二次,通常人们如何天真地尝试对事物进行排序)。存在其他算法及其变体,但需要权衡取舍。

标签: python list sorting recursion


【解决方案1】:

.append 是就地操作,因此当您返回 Lsorted.append(L[0]) 时,您将返回 None。试试这个

if len(L)==1:
    Lsorted.append(L[0])
    return Lsorted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2012-11-17
    • 2013-07-23
    • 2011-11-09
    • 2011-02-12
    • 2012-09-10
    相关资源
    最近更新 更多