美文网首页
算法导论-归并排序

算法导论-归并排序

作者: Vagitus | 来源:发表于2018-02-07 21:01 被阅读0次

1.伪代码

'''MERGE(A,p,q,r)'''
n1 = q - p + 1  //L.length
n2 = r - q      //R.length
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
'''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算法图示

2.Python代码

def merge(A, p, q, r):
    #A[p:q+1]   ,  A[q+1:r+1]
    L = A[p:q+1]
    R = A[q+1:r+1]
    i = 0
    j = 0
    for k in range (p, r+1):
        if i < len(L) and j < len(R):
            if L[i] <= R[j]:
                A[k] = L[I]
                i = i + 1
            else:
                A[k] = R[j]
                j = j + 1
        elif i < len(L):
            A[k] = L[I]
            i = i + 1
        else:
            A[k] = R[j]
            j = j + 1
    return A
def 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)

result:

Before:
[34, 45, 12, 32, 100, 46, 82, 11]
After:
[11, 12, 32, 34, 45, 46, 82, 100]

循环不变性对于归并算法

  1. 初始化: 在循环之前,子数组为空,L和R数组升序排列, i=j=1, 分别指向数组最小值
  2. 保持: 每次循环从L和R中取出当前指向两者中小的值,此值为L和R所有值中的最小值,被取用值的数组的指针向后指,保证L和R是为归并的值,此时子数组升序排列且最大值 <= L和R的最小值
  3. 终止: 结束时 子数组,L和R数组均指向数组最大值,此时子数组为L和R中的数值升序排列

归并算法递归部分:MERGE_SORT(A,p,r)

递归二分数组,直到p<=r, 即细分到单元素数组,所以已经排好序.
递归归并子数组,直到将所有数据合并完.

MERGE_SORT算法图示


欢迎关注我的博客Vagitus – Pythonista

相关文章

  • 计数排序、基数排序和桶排序

    阅读经典——《算法导论》07 到目前为止,我们已经介绍了插入排序、归并排序、堆排序、快速排序这四种排序算法,他们的...

  • 堆排序

    阅读经典——《算法导论》05 本文介绍一种神奇的排序方法:堆排序。 堆排序不像插入排序和归并排序那样直观,它利用了...

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 算法导论-归并排序

    1.伪代码 MERGE算法图示 2.Python代码 result: 循环不变性对于归并算法 初始化: 在循环之前...

  • [算法导论]归并排序

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

  • 归并排序【算法导论】

    注:学习算法导论,按照标准伪代码理解翻译为java实现,如有兴趣理解整个过程的细节,建议阅读《算法导论》第二章:2...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

网友评论

      本文标题:算法导论-归并排序

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