归并排序输出结果相同
项目场景:
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:])
自此问题解决
此次代码并不是很难主要记录一下解决方法的过程和思路。