基本排序算法系列(二)——归并排序

今天主要说一下归并排序,主要介绍可以看菜鸟教程的归并排序
归并排序的主要思路如下
1、将一个待排序列一分为2,得到左右两个待排子序列,如果序列长度小于2,就不再切分;
2、对得到的左右两个子序列重复步骤1;
3、对序列进行排序
图解如下(来源网络)
在这里插入图片描述
举个栗子
比如要排下面这个序

5,6,9,8,7

首先划分成如下样子

5,6                    9,8,7

序列长度大于2,继续划分

5  ||  6              9||    8,7

我们发现,左子序列的子序列的长度都小于2,所以开始排序得到排序好的左子序列,右子序列的右子序列长度等于2,继续划分

5,6            9||         8   ||   7

对右子序列的子序列分别排序

5,6                9  ||   7,8

然后再排序,此时左右子序列已经排序完成,

5,6          7,8,9

然后再排序得到完整的排序序列

5,6,7,8,9

具体代码如下

#数据的读取
x=input("请输入一个待排序列,中间用逗号分隔开\n")
print(type(x))
x=x.replace(","," ").split()
x=[int(val) for val in x]
print(x)
#归并排序算法
def mergeSort(arr):
    import math
    #输入一个序列,先划分成左右两个序列
    if (len(arr)<2):#长度小于2就不用在分了
        return arr
    middle=math.floor(len(arr)/2)#向下取整
    left,right=arr[:middle],arr[middle:]
    return merge(mergeSort(left),mergeSort(right))#返回将两个序列排序后的序列
def merge(left,right):
    #这时候默认左右序列已经排好序,只需对他们再排序即可
    result=[]
    while left and right:#两个序列中都有元素
        if left[0]<=right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    while left:
        result.append(left.pop(0))
    while right:
        result.append(right.pop(0))
    return result
y=mergeSort(x)
        
print("y=",y)

结果
在这里插入图片描述

算法的稳定性

注意到我们在将排好序的左右子序列归并排序时,判断条件是左边序列的数等于右边的数时,先放入的是左边的数,这是就保持了相对位置不变,所以归并排序的算法是稳定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值