【和我一起学算法】排序篇——归并排序

【和我一起学算法】排序篇——插入排序

 【和我一起学算法】排序篇——选择排序

【和我一起学算法】排序篇——冒泡排序

我来交作业了,今天讲归并排序。

归并排序是一种典型的递归排序。把复杂的排序过程分解成简单的合并子序列的过程。

目录

四、归并排序

原理

例题

第一次分组

第二轮分组

 第三轮分组

第一轮合并

第二轮合并

第三轮合并

算法伪代码

划分过程

合并过程

完整源码


四、归并排序

原理

归并排序就是将数列分成左右两个部分,将左右两个子序列排序完毕后在合并到一起,两个子序列又要划分成更小的子序列,排完序后在合并。就一直划分,直到最小的子序列长度为1时,再一步一步合并就得到了完整的有序数列。

例题

还是以数列[7,3,5,1,4,9]为例,开始归并排序。

第一次分组

将数列[7,3,5,1,4,9]分成左右两部分,left[7,3,5],right[1,4,9]

第二轮分组

将[7,3,5]再划分,left:[7];right:[3,5]; 将[1,4,9]再划分,left:[1];right:[4,9]

 第三轮分组

子序列元素个数为1时,不可划分了,停止划分;将其余不为一的子序列继续划分,直至元素个数为1为止。

全部划分阶段结束 ,我们将完整序列划分成了不可再分的子序列,这些子序列只有一个元素一定是有序的;完整划分过程如下:

下面开始合并过程

第一轮合并

 

第二轮合并

第三轮合并

完整合并过程:

归并排序完毕,经过三次合并,最终得到了一个有序序列,归并排序的时间复杂度是O(nlog^n)

算法伪代码

划分过程

middle = len(iList)
left, right = iList[0:middle], iList[middle:]

合并过程

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

完整源码

mergeSort.py

from randomList import randomList
import timeit

iList = randomList(20)

def mergeSort(iList):
    if len(iList) <= 1:
        return iList
    middle = len(iList)//2
    left, right = iList[0:middle], iList[middle:]
    return mergeList(mergeSort(left), mergeSort(right))

def mergeList(left, right):
    mList = []
    while left and right:
        if left[0] >= right[0]:
            mList.append(right.pop(0))
        else:
            mList.append(left.pop(0))
    while left:
        mList.append(left.pop(0))
    while right:
        mList.append(right.pop(0))
    return mList


if __name__ == "__main__":
    print(iList)
    print(mergeSort(iList))
    print(timeit.timeit("mergeSort(iList)", "from __main__ import mergeSort,iList", number=100))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二琳爱吃肉

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

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

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

打赏作者

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

抵扣说明:

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

余额充值