Python中的简单合并排序错误

用户名

我正在用Python执行“合并排序”分配,但始终出现“RuntimeError: maximum recursion depth exceeded 这是我的代码”错误

def merge_sort(list):
    left_num = len(list) // 2
    left_sorted = merge_sort(list[:left_num])
    right_sorted = merge_sort(list[left_num:])
    final_sort = merge(left_sorted, right_sorted)
    return final_sort

def merge(left_sorted, right_sorted):
    final_sort = []
    while left_sorted and right_sorted:
        if left_sorted[0] <= right_sorted[0]:
            final_sort.append(left_sorted[0])
            left_sorted.pop(0)
        else:
            final_sort.append(right_sorted[0])
            right_sorted.pop(0)
    final_sort = final_sort + left_sorted + right_sorted
    return final_sort

if __name__ == "__main__":
    list = [4, 2]
    print(merge_sort(list))

有人可以告诉我为什么吗?为了使问题对其他人更有用,请随时编辑问题以使其更有意义。^ _ ^

四人

在编写递归函数时,应注意基本情况,该情况决定了何时结束递归。

在您的情况下,缺少基本情况。例如,如果列表仅包含一个元素,则无需再次递归对其进行排序。因此,这是您的基本条件。

def merge_sort(list):
    if len(list) == 1:
        return list
    ...
    ...

注意:变量名称list遮盖了内置函数list因此最好避免使用内置名称。


由于您正在做很多事情pop(0),因此值得注意的是,它在列表上效率不高。引用Python的官方文档

尽管list对象支持类似的操作,但它们已针对快速固定长度的操作进行了优化,并且会招致O(n)的内存移动成本pop(0)以及insert(0, v)更改基础数据表示的大小和位置的操作。

因此,如果弹出很多,更好的选择是使用collections.deque,而不是list从a实际弹出deque是通过popleftmethod完成的

>>> from collections import deque
>>> d = deque([4, 2])
>>> d.popleft()
4
>>> d
deque([2])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章