归并排序

问题

归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。

解析

归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组,最终当划分的子数组大小为1时,将划分的有序子数组合并成一个更大的有序数组。
图解如下:
在这里插入图片描述原序列如上图。
在这里插入图片描述
开始递归分治。
在这里插入图片描述
在这里插入图片描述
直到递归到底,开始归并。在这里插入图片描述在这里插入图片描述
在这里插入图片描述
排序完成。

设计

分治:

  1. 把n个元素从中间切开,分成两部分。
  2. 步骤骤1分成的两部分,再分别进行递归分解。直到所有部分的元素个数都为1。
  3. 底层开始逐步归并两个有序的数列。
    归并:
  4. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
  5. 设定两个指针,最初位置分别为两个已经排序序列的起始位置。
  6. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
    重复步骤3直到某一指针超出序列尾。

分析

设该算法的最坏时间复杂度为W(n),则递推公式如下:
在这里插入图片描述
设n=2k
W(n)=2W(n/2)+n-1=2[2W(n/4)+n/2-1]+n-1=22W(n/4)+2n-1-2
=22[2W(n/8)+n/4-1]+2n-1-2=23W(n/8)+3n-1-2-4=…
=2kW(1)+kn-(1+2+4+…+2k-1)=2kW(1)+kn-(2k-1)
=2kW(1)+kn-2k-1
把W(1)=0和k=logn代入上式得W(n)=nlogn-n+1=O(nlogn)
所以归并排序算法得时间复杂度为O(nlogn)。

源码

https://github.com/Geedhayb/Geed/blob/master/mergeSort.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值