分治法-归并排序

作者: b64c74899092 | 来源:发表于2016-05-26 21:32 被阅读283次

分治法

很多算法都使用了递归结构,通过递归来解决相互关联的问题。把一个规模很大的问题分解成几个相似的规模较小的子问题,然后通过解决小问题,递归解决大问题。

分治法主要是基于三个步骤来解决问题的:

  • divide(分) 将问题分割为规模更小的子问题
  • conquer(治) 将子问题各个击破
  • combine(合) 合并子问题的解,得到原问题的解

归并排序

归并排序可以说是使用分治法思想的典型算法。

  • divide 将n个元素的序列分成2个大小相同的子序列
  • conquer 对2个子序列递归使用归并排序
  • combine 合并两个子序列得到排好序的原序列

当子序列大小为1的时候,子序列有序,而归并排序的关键是合并两个已排序的子序列。我们通过调用MERGE(A,p,q,r)来实现,其中A是数组,其余的都是数组中的索引,而且p<=q<r。A[p,..q]和A[q+1,..r]是有序子数组,通过合并两个子数组使A[p,..,r]有序。

MERGE函数需要o(n)时间,其中n=r-q+1是需要排序的数组规模,下面是函数的伪代码:

MERGE(A,p,q,r)

n1 = q-p+1 
n2 = r-q
for i = 1 to n1
    L[i] = A[p+i-1]

for j = 1 to n2
    R[j] = A[q+i]

L[1+n1]=无穷大
R[1+n2]=无穷大

i=1
j=1

for k = p to r
    if L[i]<=R[j]
        A[k] = L[i]
        i++
    else 
        A[k]=R[j]
        j++

初始化:k=p,还没有向A中插入元素所有的数组都是有序的

循环中:假设L[i]<R[j]那么L[i]是未插入元素中的最小元素,在插入之前是有序的,所以插入之后任然有序。

结束:k=r+1 所有元素都已经按序插入到原数组中,数组有序。

我们可以把MERGE作为归并排序的递归函数。

主函数伪代码:

MERGE-SORT(A,p,r)
if p < r
    q=L(p+r)/2 //向下取整
    MERGE-SORT(A,p,q)
    MERGE-SORT(A,q+1,r)
    MERGE(A,p,q,r)

时间分析

T(n) 数据规模n的运行时间
D(n) 分解问题时间
C(n) 合并问题时间
我们把问题分解为a个子问题,每个问题的规模是n/b

可以构造一系列递归树,完全扩展的递归树有![](http://www.forkosh.com/mathtex.cgi? \log_{2}(n+1))层,每一层是cn,总代价是![](http://www.forkosh.com/mathtex.cgi? cn(\log_{2}(n+1))),时间复杂度是![](http://www.forkosh.com/mathtex.cgi? n\log_{2}n)。

相关文章

  • python实现归并算法

    归并排序是采用分治法的一个非常典型的应用,另一个可以采用分治法的是快速排序,归并算法比快速排序速度稍低。归并排序的...

  • [算法导论]归并排序

    时间复杂度 《算法导论》2.3.1 分治法。 归并排序采用了分治法的递归排序。分治法:分解子问题,解决子问题,合并...

  • 12 基本排序算法:归并排序

    归并排序 原理 归并排序思想 该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(d...

  • 归并排序

    1、分治法 归并排序是完全遵循分治策略的排序算法。什么是分治法? 分治法,即将原问题分解为几个规模较小的子问题,递...

  • 基本算法——归并排序算法

    归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(分治法将问题分(d...

  • python实现归并排序(MergeSort)

    python实现【归并排序】(MergeSort) 算法原理及介绍 归并排序的核心原理是采用分治法(Divide ...

  • 归并排序(二路归并排序)

    归并排序的思路 归并排序是通过“归并”操作完成排序的,将两个或者多个有序子表归并成一个子表。归并排序是“分治法”的...

  • 数据结构--归并排序

    归并排序 (Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divid...

  • iOS算法系列(5)

    归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer...

  • 数据结构与算法之美-归并排序

    Merge Sort - 归并排序 核心:归并排序是采用分治法的一个非常典型的应用。 归并排序的思想就是先递归分解...

网友评论

本文标题:分治法-归并排序

本文链接:https://www.haomeiwen.com/subject/joyxdttx.html