Python中的简单合并排序错误

时间:2015-02-01 03:58:17

标签: python list python-3.x recursion mergesort

我在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))

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

2 个答案:

答案 0 :(得分:4)

当你编写一个递归函数时,你应该注意基本情况,它决定递归何时结束。

在您的情况下,缺少基本情况。例如,如果列表只有一个元素,那么您没有再次递归排序。所以,这是你的基本条件。

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

注意:变量名称list会影响内置函数list。所以最好避免使用内置名称。


由于你正在做很多pop(0),所以值得注意的是它在列表上效率不高。引用Python's official documentation

  

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

因此,如果你弹出很多,那么更好的选择是使用collections.deque,而不是list。来自deque is done with popleft method的实际弹出。

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

答案 1 :(得分:1)

您在merge_sort中没有退出点。您需要执行以下操作:

left_num = len(list) // 2
if left_num <= 1:
    return list

您总是需要在递归函数中使用条件退出:if COND then EXIT else RECURSION_CALL