快速排序(Quicksort)学习笔记

看完邓俊辉的《数据结构(第三版)》中快速排序后的学习总结

一.快速排序(Quicksort)基于分治策略的又一经典算法。类似于归并排序(Mergesort)。

将序列分为前后两个子序列,并对这两个规模更小的子序列进行递归。

Quicksort和Mergesort都采用了分治策略。

但Quicksort要求前一序列中的任何元素在数值上都不得超过后一序列中的任意元素。


二.轴点(pivot)



快速排序算法的核心在于如何快速的确定轴点。就是将所有元素逐个转换为轴点的

过程。

三.构造轴点


一般选取首元素作为轴点的候选lo与hi为两个指针。这两个指针将整个序列分为LUG三个部分。L是一个前缀,其中的任一个元素在数值上都不超过轴点候选。G是一个后缀,其中的任一个元素在数值上都不小于轴点候选。而居于二者之间的子序列U则由大小仍然未知的元素构成。在初始状态下,U是整个序列,而L和G都是空的。

算法启动后,lo和hi会交替移动,批次靠近。lo每向后移动一步,L也会向后拓展一个单位。hi每向前移动一步,G也会向前拓展一个单位。为了完成这种扩展,需要将U中的某个元素适当地加入到L或G中。当lo与hi同时指向同一个位置时,我们只需将之前选定的轴点候选放到这个位置。这个候选者也就成为了名副其实的轴点。

四.单调性+不变性


1)不变性:子序列L中的元素都不超过轴点候选,子序列G中的元素都不小于轴点候                     选。[lo]和[hi]交替空闲。

2)单调性:子序列长度的单调性。子序列L个子序列G的长度都会有所增加。同时相应的子序列U的长度缩短了。

初始条件下,U的首元素已经作为轴点的候选被取出备份,因此它可以被认为是空闲的。

一般情况下的U的首元素为lo,末元素为hi。不是一般性假设此时的lo是空闲的。因此可以尝试着向左侧拓展子序列G,具体来说只要当前U的末元素,也就是hi在数值上不小于候选轴点。通过令hi--递减一个单位,从而将元素hi归入到子序列G中。接下来,若果新的末元素,依然满足这样的要求,我们就继续将其归入到G中。直到某个时刻末元素hi不在满足这个要求。也就是说此时的元素hi在数值上会严格小于候选轴点。此时,将末元素hi转移至当前仍然空闲的单元lo中。因此单元lo将不再是空闲的,相应的hi随即变成空闲的。也就是说U所具有的不变性依然成立。接着去考察U的首元素lo,只要这个元素在数值上不超过候选轴点,则令lo++递增一个单位。从而将这个首元素归入到子序列L中。子序列L也会因此向后端拓展一个单元。只要首元素lo在数值上依然不超过候选轴点,我们都会同样的将它归入到子序列中。否则,将lo的元素转移到当前仍然是空闲的那个单元hi中。

当U退化为只有一个空闲单元时,此时只需将候选轴点植入于唯一的这个空闲单元,真正成为一个名副其实的轴点。此时,一次快速划分结束。

五.实例


六.性能分析

1)不稳定性unstable

     原始序列:6 3 8 2 5a 9 4 5b 1 7

     一次快速排序后:1 3 5b 2 5a 4 6 9 8 7

     5a和5b的排列顺序发生了颠倒,所以说快速排序是不稳定的。

2)就地in-place

     整个算法可以就地实现,也就是说它只需O(1)常数的附加空间。

     原始的输入序列+常数个指针+用于保存候选轴点的一个单元

3)最好情况

     每次划分都(接近)平均,轴点总是(接近)中央。

     T(n) = 2*T((n-1)/2) + O(n) = O(nlogn)

4)最坏情况

   

     每一次候选节点都是在当前而言,最小或最大的极值元素。以至于划分之后,子序列L或G为空,在我们所划分出来的一对子任务中,总是有一个规模为零,而另一个相对于此前的规模,只减少了一个单元。

     因此我们可以采取某些策略,在一定程度上降低最坏情况出现的概率。

随机选取法:不再是每次都选取首元素作为候选轴点,而是在整个序列中随机的选择其一。

三者取中法每次在整个序列中随机的抽取三个元素,将其中数值居中的那个作为候选轴点。

5)平均情况:O(nlogn)

    注:具体计算步骤涉及调和级数,高数还是得好好学。

     







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值