归并排序输出结果相同

项目场景:

python数据结构先后学完了,栈、列表、递归,开始进一步学习排序,由于资源有限只能对着PPT敲一下代码。之前出现报错都是跟据经验直接看报错信息,分析代码,然后更改,很快就可以解决,但这次博主折腾了半个多小时,有必要记录用一下。


问题描述:

归并排序输出结果相同

def merge_sort(lst):
    if len(lst)<=1:
        return lst

    middle=len(lst)//2
    left=merge_sort(lst[:middle])
    right=merge_sort(lst[:middle])
    merged=[]
    while left and right:
        if left[0]<=right[0]:
            merged.append(left.pop(0))
        else:
            merged.append(right.pop(0))
    merged.extend(right if right else left)
    return merged

alist=[26,46,65,48,6,85,2,64,56]
print(merge_sort(alist))

在这里插入图片描述


原因分析:

博主首先想到,是不是pop(0)命令失效,导致没有删除列表第一项,毕竟博主对pop命令并不是很熟悉。

    while left and right:
        if left[0]<=right[0]:
            merged.append(left.pop(0))
        else:
            merged.append(right.pop(0))

通过代码检测没有发现问题,pop可以正常运行。
在这里插入图片描述
在分析分割调用自身的这几行命令。

	middle=len(lst)//2
    left=merge_sort(lst[:middle])
    right=merge_sort(lst[:middle])

为了清楚地看到每次递归调用,博主将每一次的列表打印出来,加了两行代码

	middle=len(lst)//2
    left=merge_sort(lst[:middle])
    print(left)
    right=merge_sort(lst[:middle])
    print(right)

在这里插入图片描述
这里打印出一堆26,说明问题发生在这几行代码之中。
开始逐条分析,第一条列表减半没有问题
同时对比第二三条发现赋值一样,没有成功分割,自此找到了问题。


解决方案:

将第七行代码修改为

right=merge_sort(lst[middle:])

自此问题解决
在这里插入图片描述
此次代码并不是很难主要记录一下解决方法的过程和思路。

posted @ 2021-04-03 10:48  lcc-666  阅读(35)  评论(0编辑  收藏  举报