【算法导论】插入排序与归并排序

学习目标:

学习插入排序和归并排序


学习内容:

  1. 插入排序
  2. 归并排序
  3. 二者对比

  1.插入排序

输入:n个数的一个序列<a1,a2,...,an>

输出:输入序列的一个排列<a1',a2',...,an'>,满足a1'<=a2'<=...<=an'

输入是以n个元素的数组的形式出现的

其伪代码如下所示:

for j=2 to A.length
    key=A[i]//在A[1..j-1]序列中插入A[j],其中key为关键词是希望排序的数
    i=j-1
    while i>0 and A[j]>key
          A[i+1]=A[i]
          i=i-1
    A[i+1]=key

下图表明了该算法如何工作

我们把需要排列的数组的性质形式地表示为循环不变式,即在每次迭代开始时,子数组由原来数组中的元素组成,但都已按序排列

 2.归并排序

归并排序遵循分治,将原问题分解为几个子问题,再求解子问题,最后合并子问题的解

例如:有一个数组A=[4,3,7,9,2,5,10,6]

           首先把数组A分成两个子数组a1=[4,3,7,9],a2=[2,5,10,6],将其按顺序排列好新的子数组a1'=[3,4,7,9],a2'=[2,5,6,10],然后分别用首位进行对比较小的一个放入新的数组A’中,然后再用两个新子数组的首位对比,以此类推,就得到了A‘=[2,3,4,5,6,7,9,10]

其伪代码如下所示:

n1=q-p+1
n2=r-q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i=1 to n1
    L[i]=A[p+i-1]
for j=1 to n2
    R[j]=A[q+j]
L[n1+1]=∞
R[n2+1]=∞
i=1
j=1
for k=p to r 
    if L[i]<=R[j]
    A[k]=L[i]
    i=i+1
else A[k]=R[j]
    j=j+1

 3.对比

在大概了解了插入排序和归并排序以后,那么两者的区别在哪呢?

运行时间。算法的运行时间依赖诸多因素,输入本身就是一个因素,这里还要说的一个就是输入规模

对于插入排序来说,运行时间是每条语句运行时间之和,所以该算法分为两种情况:第一种是最佳情况,此时,输入的数组已经排好序列,时间与数组中元素的个数n成线性函数T(n)=an+b,则T(n)=Θ(n);第二种是最坏的情况,此时,输入的数组是反向排序,时间与数组中元素的个数n成二次函数T(n)=an^2+bn+c,T(n)=Θ(n^2),这种情况也是运行时间的一个上界

注:Θ为渐近符号,需忽略函数的低阶项和重要项的系数

对于归并排序来说,也有两种情况,第一种是n为一时,此时的运行时间为常数,即为Θ(1);第二种是n大于一时,这里假设将原问题分解为2个规模为n/2的子问题,那么求解一个子问题所需的时间为T(n/2),两个子问题也就是2T(n/2),合并和分解问题的时间需要Θ(n)+Θ(1),所以它的总的运行时间也就是T(n)=2T(n/2)+Θ(n)(因为Θ(n)+Θ(1)得到的是线性函数,所以结果为Θ(n))

将T(n)=2T(n/2)+Θ(n)更改为T(n)=2T(n/2)+cn,通过递归树我们可以得到T(n)=cnlgn+cn,即T(n)=Θ(nlgn)(这里的递归树后续在详细说明)

因此,当规模足够大时,Θ(nlgn)比Θ(n^2)要快,归并排序优于插入排序;当规模很小时,插入排序会更好。(这里的界限大概在30)

学习总结

1.插入排序就是关键词比大小然后确定是否需要移位;归并则是分解、排序、合并。

2.不管插入还是归并都可以进行排序,但是我们要根据输入规模的大小来决定运用哪种方法是最优解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

曦-夕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值