题目
先将待排序的序列划分成若干长度为1的子序列,依次将两个子序列排序后合并成长度为2的子序列;再依次将两个子序列排序后合并成长度为4的子序列,直至合并成最初长度的序列为止,得到一个排序后的序列。 本实例要求编写代码,利用递归实现归并排序算法。
思路
1、先明白什么是归并排序,请看图理解
2、先进行列表拆分,使用列表拆分,使用递归一直拆到只剩一个元素
3、对拆后的元素进行合并,合并的时候要考虑三种情况:
(1)左右两边都有元素
(2)只剩左边元素
(3)只剩右边元素
4、考虑抽取元素的方法,就是抽取左边或右边第一个元素放在新列表的最后一位。这样可以保证采用从小到大排序就是后面都比前面的大或者采用从大到小排序就是后面都比前面的小。
代码:走起~(注释写的很详细哦,可以参考一下)
n=[9,8,6,7,4,6,3,9]
print("原列表:",n)#输出原数组
left=[]
right=[]
#先拆分
def depart(n):
if len(n)==1:return n#如果列表中只有一个元素,就直接输出
left=n[:(len(n)//2)]#对数组对半分开取左边的一部分
right=n[((len(n)-1)//2+1):]#对数组对半分开取右边的一部分
left_res=depart(left)#进行递归直到left_res只有一个元素为止
right_res=depart(right)#进行递归直到right_res只有一个元素为止
result=add(left_res,right_res)#使用合并函数进行排序以及合并
return result
#后合并
def add(left,right):
res=[]#定义一个新的列表
while left and right:#当左边和右边都有数值时,进行循环
if left[0]<right[0]:#如果左边的第一个值小于右边的第一个个值,就把左边的值输出
#如果想使用归并排序进行逆向输出,只需要把这里改为:
#if left[0]<right[0]:
# res.append(right.pop(0))
#else:res.append(left.pop(0))就欧克啦~
res.append(left.pop(0))#从左边拿出第一个元素添加到res的末尾
else:res.append(right.pop(0))#从右边拿出第一个元素添加到res的末尾
while left:#如果有一方的元素全部移除了,那就检查另一方还有没有元素,如果左边有,就进入循环
res.append(left.pop(0))#将左边第一个加入res列表中的最后一个
while right:#如果右边有,就进入循环
res.append(right.pop(0))#将右边第一个加入res列表中的最后一个
return res
print("排完序之后的列表",depart(n))#调用函数,进行输出
结果:嘿嘿,完美~
原列表: [9, 8, 6, 7, 4, 6, 3, 9]
排完序之后的列表 [3, 4, 6, 6, 7, 8, 9, 9]