Python:归并排序

题目

 先将待排序的序列划分成若干长度为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]

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_55638680

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值