第二部分--排序和顺序统计学-第7章--快速排序

说明:该系列博客整理自《算法导论(原书第二版)》,但更偏重于实用,所以晦涩偏理论的内容未整理,请见谅。另外本人能力有限,如有问题,恳请指正!

1、综述

    快速排序是一种原地排序算法,对包含 n 个数的输入数组进行排序,最坏情况运行时间为 Θ ( n2 )。虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳的实用选择,这是因为其平均性能相当好:期望的运行时间为 Θ ( n lg n ),且 Θ ( n lg n )记号中隐含的常数因子很小。由于快速排序是一种原地排序,所以在虚存环境中也能很好的工作。

2、不随机快速排序(平均情况下的时间复杂度相对较高)

    像合并排序一样,快速排序也是基于分治模式的。下面是对一个子数组 A [ p .. r ]快速排序的过程,符合分治过程的三个步骤:

        1)、分解:数组 A [ p .. r ]被划分成两个(可能为空)子数组 A [ p .. q - 1 ]和 A [ q + 1 .. r ],使得 A [ p .. q - 1 ]中的每一个元素都小于等于 A [ q ],而且,A [ q ]小于等于 A [ q + 1 .. r ]中的元素。下标 q 也在这个划分过程中计算得出。

        2)、解决:通过递归调用,对子数组 A [ p .. q - 1 ]和 A [ q + 1 .. r ]进行快速排序。

        3)、合并:因为两个子数组是就地排序的,将它们合并不需要操作,整个数组 A [ p .. r ]已排序。

        下面的过程实现了快速排序:

        QUICK-SORT(A, p, r)

            if p < r

                q = PARTITION(A, p, r)

                QUICK-SORT(A, p, q - 1)

                QUICK-SORT(A, q + 1, r)

        快速排序算法的关键是 PARTITION 过程,它对子数组 A [ p .. r ]进行就地重排:

        PARTITION(A, p, r)

             x = A[r]

             i = p - 1

             for j = p to r - 1//首先遍历出小于中值元素的值,放在i+1左侧,

                 if A[j] <= x

                     i = i + 1

                     exchange A[i] with A[j]

             exchange A[i + 1] with A[r]//遍历结束后交换中值和i+1元素的值,则i+1之后的元素都大于中值

             return i + 1

        PARTITION 总是选择 x = A [ r ]作为 主元 (pivot element),并围绕它来划分子数组。在第3行到第6行中循环的每一轮迭代开始时,对于任何数组下标 k ,有

                如果 p <= k <= i ,则 A [ k ] <= x

                如果 i + 1 <= k <= j - 1,则 A [ k ] > x

                如果 k = r ,则 A [ k ] = x

        下图总结了这一结构。过程 PARTITION 作用于子数组 A [ p .. r ]中得到四个区域。 A [ p .. i ]中的各个值都小于等于 x , A [ i + 1 .. j - 1 ]中的值都大于 x , A [ r ] = x 。 A [ j .. r - 1 ]中的值可以是任何值。

3、快速排序的性能

    快速排序的运行时间与划分是否对称有关,而“划分是否对称”又与选择了哪一个元素来进行划分有关。如果划分是对称的,那么本算法从渐近意义上来讲,就和归并排序算法一样快;如果划分是不对称的,那么本算法渐近上就和插入排序一样慢。下面我们讨论划分为对称和不对称时快速排序的性能。

    1)、最坏情况划分

        快速排序的最坏情况划分发生在划分过程产生的两个区域分别包含 n - 1个元素和1个0元素的时候。假设算法的每一次递归调用都出现了这种不对称划分。划分的时间代价为 Θ ( n )。对一个大小为0的数组进行递归调用后,返回 T ( 0 ) = Θ ( 1 ),故算法的运行时间为 T ( n ) = T ( n - 1 ) + Θ ( n )。

        从直观上看,如果将每一层递归的代价加起来,就可以得到一个算术级数,其和值的量级为Θ ( n2 )。利用代换法,可以比较直接的证明递归式T ( n ) = T ( n - 1 ) + Θ ( n )的解为T ( n ) = Θ ( n2 )。

        因此,如果在算法的每一层上递归上,划分都是最大程度不对称,那么算法的运行时间就是Θ ( n2 )。即,快速排序算法的最坏情况运行时间并不比插入排序好。此外,当输入数组已经完全排好序时,快速排序的运行时间为Θ ( n2 ),而在同样情况下,插入排序的运行时间为Θ (n)。

    2)、最佳情况划分

        在 PARTITION 过程可能的最平衡划分中,得到的两个子问题的大小都不可能大于n/2,因为其中一个子问题的大小为 FLOOR(n / 2) ,另一个子问题的大小为 CEIL(n / 2) - 1。这种情况下,其运行时间的递归式为 T ( n ) <= 2 T ( n / 2 ) + Θ ( n )。该递归式的解为 T ( n ) = O ( n lg n )。由于在每一层的递归上,划分的两边都是对称的,因此,从渐近意义上来看,算法运行的就跟快了。

    3)、平衡的划分

        快速排序的平均情况运行时间与其最佳情况运行时间很接近,而不是非常接近于其最坏情况运行时间。要理解这一点,就要理解划分的平衡性是如何在刻画运行时间的递归式中反映出来的

        当好、坏划分交替分布在各层时,快速排序的运行时间和最佳情况划分是一样的,即O ( n lg n ),只是O记号中隐含的常数因子要略大一些。如何好坏交替呢?需要随机的选取选择 x 作为 主元 (pivot element),而不是像不随机快速排序那样 x 一直等于 A [ r ]。随机快速排序在下面讲解。

4、随机快速排序

    在探讨快速排序的平均性态过程中,我们已经假定输入数据的所有排列都是等可能的,但在工程中,这个假设并不是总是成立的。所以,我们需要向算法中加入随机化的成分,以便于对于所有输入均能获得很好的平局情况性能。

    随机划分使用 随机取样 (random sampling)的随机化技术,从子数组 A [ p .. r ]中随机选择一个元素并与 A [ r ]互换,因为主元是随机选择的,我们期望在平均情况下,对输入数组的划分能够比较对称。

RANDOMIZED-PARTITION(A, p, r)

     i = RANDOM(p, r)

     exchange A[r] with A[i]

     return PARTITION(A, p, r)

    RANDOMIZED-QUICK-SORT(A, p, r)

            if p < r

                q = RANDOMIZED-PARTITION(A, p, r)

                RANDOMIZED-QUICK-SORT(A, p, q - 1)

                RANDOMIZED-QUICK-SORT(A, q + 1, r)

5、参考

    算法导论读书笔记(7)

    快速排序算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容