• 合并排序算法时间复杂度分析


    一、合并已排序的两个数组,依次比较两个数组元素大小,并按大小加入到暂存数组B,最后保存到A:

    Algorithm: MERGE(A, p, q, r)

    输入:数组A[p...q]和A[q+1...r],各自按升序排列

    输出:将A[p...q]和A[q+1...r]合并后的升序排序的新数组

    01. s←p; t←q+1; k←p; {s, t, p 分别指向A[p...q], A[q+1...r]和暂存数组B}

    02. while s≤q and t≤r

    03.   if A[s] ≤A[t] then

    04.     B[k]←A[s]

    05.     s ←s+1

    06.   else

    07.     B[k]←A[t]

    08.     t←t+1

    09.   end if

    10.   k←k+1

    11.end while

    12. if s=q+1 then B[k...r] ←A[t...r]

    13. else B[k...r] ←A[s...q]

    14. end if

    15. A[p...r] ←B[p...r]

    二、对数组进行排序(分治策略):

    Algorithm: MERGESORT(A[low…high])

    输入:待排序数组A[low,...high]

    输出:A[low…high]按非降序排列

    01. if low<high then

    02.   mid←[(low+high)/2]

    03.   MERGESORT(A, low, mid)

    04.   MERGESORT(A, mid+1, high)

    05.   MERGE(A, low, mid, high)

    06. end if

    三、时间复杂度分析:

    1. 最小比较次数:

      n = 1时,C(n) = 0;

      n >= 2时,C(n) = 2C(n/2) + n/2,理想情况下,MERGE算法进行比较次数,最少为与子数组长度相等。此时其中一个子数组先全部依次进入暂存数组B,然后另一个子数组直接全部加入B。

    结果:C(n) = (nlogn)/2

    2. 最大比较次数:

      n = 1时,C(n) = 0;

      n>= 2时,C(n) = 2C(n/2) + n-1,理想情况下,MERGE算法进行比较次数,最大为总长度 - 1。此时两个子数组的元素轮流加入暂存数组B,因此共比较n - 1次。

    结果:C(n) = nlogn - n + 1

    综合1和2得,合并排序算法时间复杂度为T(n) = Θ(nlogn)。

  • 相关阅读:
    提高PHP程序运行效率的方法
    必须知道的sql编写技巧。多条件查询不拼接字符串·的写法
    数据库SQL优化大总结之 百万级数据库优化方案
    编程一开始就应该养成的好习惯
    php图像处理
    jqurey 简单的,我也简单
    菜单上下级 (全国地区)
    think php v5.0
    正则表达式
    有感赠朵朵
  • 原文地址:https://www.cnblogs.com/wylz/p/3719741.html
Copyright © 2020-2023  润新知