Python中的简单合并排序错误

Python中的简单合并排序错误,python,list,python-3.x,recursion,mergesort,Python,List,Python 3.x,Recursion,Mergesort,我正在用Python进行合并排序赋值,但我一直有RuntimeError的错误:超过了最大递归深度 这是我的密码: 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_sort

我正在用Python进行合并排序赋值,但我一直有
RuntimeError的错误:超过了最大递归深度
这是我的密码:

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_排序(列表):
left_num=len(列表)//2
左排序=合并排序(列表[:左排序])
右排序=合并排序(列表[左编号:)
最终排序=合并(左排序,右排序)
返回最终排序
def合并(左排序,右排序):
最终排序=[]
左排序和右排序时:

如果左排序[0]则在
merge\u sort
中没有退出点。您需要执行以下操作:

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

如果left\u num在
合并\u排序
中没有退出点。您需要执行以下操作:

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

如果在编写递归函数时使用left_num,则应注意基本情况,它决定递归何时结束

在您的案例中,基本案例缺失。例如,如果列表只有一个元素,则不必再次对其进行递归排序。这就是你的基本条件

def merge_sort(list):
    if len(list) == 1:
        return list
    ...
    ...
注意:变量名
list
隐藏内置函数
list
。所以最好避免使用内置名称


由于您正在执行大量的
pop(0)
s,因此值得注意的是,它在列表中效率不高。引用

虽然
list
对象支持类似的操作,但它们针对快速固定长度操作进行了优化,并且会为
pop(0)
insert(0,v)
操作带来O(n)内存移动成本,这两种操作都会改变基础数据表示的大小和位置

因此,如果您经常弹出,更好的替代方法是使用,而不是使用
list
。实际从一个窗口弹出


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

在您的案例中,基本案例缺失。例如,如果列表只有一个元素,则不必再次对其进行递归排序。这就是你的基本条件

def merge_sort(list):
    if len(list) == 1:
        return list
    ...
    ...
注意:变量名
list
隐藏内置函数
list
。所以最好避免使用内置名称


由于您正在执行大量的
pop(0)
s,因此值得注意的是,它在列表中效率不高。引用

虽然
list
对象支持类似的操作,但它们针对快速固定长度操作进行了优化,并且会为
pop(0)
insert(0,v)
操作带来O(n)内存移动成本,这两种操作都会改变基础数据表示的大小和位置

因此,如果您经常弹出,更好的替代方法是使用,而不是使用
list
。实际从一个窗口弹出


请问,对于
deque
,如何获取
popleft()
之后的剩余“列表”?对于
deque
,如何获取
popleft()之后的剩余“列表”