综合分析一下各个排序算法_算法设计与分析 - 分治策略 - 快速排序算法

快速排序算法

主要内容来自【北京大学】 算法设计与分析

基本思想:被排序数组为A,用数组首元素作为标准将A分成前后两部分,比首元素小的元素构成数组的前部分,比首元素大的部分构成数组的后部分。这两部分构成两个新的子问题,算法接着对这两个数组进行递归。

Quicksort(A,p,r) //p,r分别为数组A的首元素和尾元素的下标
输入:数组A[p..r],1<=p<=r<=n 输出:从A[p]到A[r]按递增顺序排好序的数组A

if p<r
then q <- Partition(A,p,r)   //划分数组,找到首元素A[p]在排好序后的位置q
     A[p] <-> A[q]
     Quicksort(A,p,q-1)
     Quicksort(A,q+1,r)

Partition是划分的过程

x <- A[p]
i <- p+1
j <- r+1
while true do
    repeat j <- j-1
    until A[j] <= x
    repeat i <- i+1
    until A[i] > x
    if i < j
    then A[i] <-> A[j]
    else return j

下面举一个例子

9f9182bea67066344abc08de17d82995.png

算法的时间复杂度分析

  1. 每个元素都要和首元素进行一次比较(在i,j相遇位置附近的元素可能比较2次),所以划分过程的工作量是O(n)。
  2. 两个子问题递归调用的工作量

快速排序算法的各种情况分析

1.

均等划分子问题

先看均等划分的例子,如果每次划分得到的子问题大小都相等,即每个子问题的规模都等于n/2,那么在当前实例下时间复杂度函数的递推方程是:

5e8d4d7b8669d7df4a41c1d60e702ef6.png

根据主定理,该方程的解T(n)=O(nlogn),这是一种比较好的情况。

2.

子问题规模不同,但遵从一定比例

即使子问题规模不一样,但两个子问题的规模遵从一定的比例,比如1:9,那么时间复杂度函数的递推方程为:

cdd1a50f3d93cc3534c45ca6555450fd.png

7679a19fb67dd5a629bdc423ac0d9299.png

c是常数


这棵树不均衡,从树根到最左边树叶的路径最短,在这条路径上,每层的子节点的值是父节点值的1/10,设树根是第0层,每层为第k层,

4056308c72e54a6a8d9480285ef08d71.png

代表当前第k层的值,即子问题规模。

89d81a05ca6d2ffde9a857a87ac9448d.png

代表第0层值为n,

66b182a5bf20cfc9dabc78461a0073e0.png

即子问题规模为1,到达树叶时,

e7f2622017f7ae54776d2ab22dfbc2ae.png

同理得到最右边路径长度是

7e4f248e5c464bc3d68fe704f20c7f5c.png

,为了表示时间渐进的上界,不妨取最长路径作为树的层次,即所有节点的数值之和为

ded76ae1bb6ff399287fedbf9ff8d771.png

这说明,即使子问题规模不均衡,但是只要比例一定,快速排序算法的时间复杂度仍旧是O(nlog(n))。

3.

下面介绍极端不均衡的情况

即划分后两个子问题的规模一个是0,另一个是$n-1$的情况,当数组元素是按从小到大正排序或从大到小逆排列时,就会呈现这种划分。

7fe2969232eb445df34b917fe5103d9d.png

根据迭代归纳,此时

6a1477b836dd1006aa962c3989c6ca18.png

但最坏情况出现的概率很低,它的平均性能还是不错的。

4.

平均情况

假设交换后,数组A的首元素在排好序后处在n个位置中的任何位置都是等可能的,即它处在任何位置的概率都是1/n。如果它处在位置i(i=1,2,...,n),那么划分后的两个子问题规模分别是i-1和n-1。考虑到T(0)=0,因此可以得到

14743ee3eb9dd5cf76cca6ddabf3d76f.png

当把O(n)看作n-1时,这个方程的解是T(n)=O(nlogn)。 对于排序问题,平均情况下效率最高的算法就是时间复杂度为O(nlogn)的算法。在这个情况下,快速排序算法是平均情况下效率最高的算法之一。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值