归并排序

 

思想:

归并排序是把两个或者两个以上的有序序列合并成一个新的有序序列。它的基本思想是:把数组A看做是n个有序的子序列组成,每个子序列长度为1。然后两两合并,得到n/2个长度为2的子序列;再继续两两合并。如此重复,直到得到一个长度为n的有序序列。

 

归并排序本质上是分治法。所谓分治法就是:把原问题分成n个规模较小而结构和原问题相似的子问题;递归地解决这些子问题,然后合并其结果就得到原问题的解。分治法在每一层递归上都有三个步骤:分解;解决;合并。

合并排序算法的步骤如下。1、分解:把n个元素分成各含n/2个元素的子序列;2、解决:用合并排序法对两个子序列递归地排序;3、合并:合并两个已排序的子序列已得到排序结果。

 

伪代码:

Merge-Sort(A, p, r)

         If p<r

                   q = (p+r)/2               //分解

                   merge-Sort(A, p, q)        //解决

                   merge-Sort(A, q+1, r)      //解决

                   merge(A, p, q, r)          //合并

 

merge(A,p,q,r)

         for(i=p, j=q+1, k=p; i<=p && j<=r; k++)

                   if(A[i] < A[j])

                            tempA[k] = A[i++]

                   else

                            tempA[k] = A[j++]

         if(i<=m) tempA[k,…,n] = A[i,..,q]

         if(j<=n) tempA[k,…,n] = A[j,…,r]

         A[p,..,r] = tempA[p,…,r]

                  

算法分析:

分治法的时间复杂度,与其合并算法的时间复杂度有很大的关系。

Merge的时间复杂度是O(n)

T(n)=2T(n/2)+O(n)=O(nlgn)

归并排序的时间复杂度与排列无关,无论是最好还是最坏情况都是O(nlgn)

归并排序是一种稳定的排序。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值