算法——快速排序

有人甚至将快排称为分治法,但分治更多应该指明是一种思想,而非具体的排序算法。
对于快速排序的内容,我这样概括:每趟排序将一个基准点归位,并且将原序列依照基准点分为两个部分。

实例

对于下面的序列:

{72,6,57,88,60,42,83,73,48,85}

我们来执行第一趟快排,以第一个元素72为基准点,将low指针也指向72,high指针指向85。我们开始第一趟快排,想象high指针从右侧第一个元素开始往左侧移动,当元素不在大于72时,也就是high指针指向48时,将48换到low指针指向的位置,也就是72元素的位置。此时有两个元素确定了与基准点元素的大小关系了(85,48)。
序列变为:

{48,6,57,88,60,42,83,73,48,85}

与刚刚相反,我们将low指针开始朝右侧移动,看元素是否小于基准点的元素,low指针跑到88时,会发现此时不再小于72了。则将此元素换到右侧high指针指向的位置。
序列变为:

{48,6,57,88,60,42,83,73,88,85}

类似的,再转换指针,让high指针从右侧往左侧走,73大于72,83大于72,但到了42就不满足条件了,我们将它换到左侧low指针指向的位置(留意到不会发生元素覆盖的现象,因为low指针指向的元素已经被换到了右侧)。
序列变为:

{48,6,57,42,60,42,83,73,88,85}

你可能也知道了,再将low指针从左往右走,42自然小于72,60小于72,又出现了一个42,但此时由于low和high指向了同一个位置,循环结束了。其实还不算完,我们还需要将这个位置上的值换为基准点的值。
序列变为:

{48,6,57,42,60,72,83,73,88,85}

我们会发现,一趟快排后,此时整个元素被72分为了两个子序列,左侧小于72,右侧大于72。
有人说这其实有些像填坑,我们就按照他们说的再来一趟:

0:{72,6,57,88,60,42,83,73,48,85}
1:{48,6,57,88,60,42,83,73,__,85} 
85和48已经排序完成,确定了他们在基准点的左侧还是右侧。
2:{48,6,57,__,60,42,83,73,88,85} 
88大于72了,将它丢到右侧去填坑,原位置留坑。此时85,48,6,57,88也已经确定关于基准点的位置了。
3:{48,6,57,42,60,__,83,73,88,85}
转换指针,high从右朝左走,到42发现小于72,将它丢入左侧填坑, 85,48,6,57,88,73,83,42均已经确定了关于基准点的位置了。
4:{48,6,57,42,60,__,83,73,88,85}
此时已经非常直观了,我们会发现仅60没有确认关于基准点的位置,我们转换指针,low指针从左朝右走,扫过60,发现不需要转换,之后达到high指向的位置,两个指针重合了。
5:{48,6,57,42,60,72,83,73,88,85}
将最后一个坑补上基准元素。

我们回顾一下,对于这趟排序,我们将n-1个元素与基准点元素做了对比,移动了若干个元素(具体几个目前不需要关注,但它一定小于n-1),将它们归置到想对基准点元素来说合适的一侧。
之后我们要做个,就是将基准点元素两个的部分,分别进行快排。每次快排确定一个基准点元素的位置,将原序列分为两个部分,如此往复,直到边界条件。

分析性能

对于快排,比较痛苦的事情就是分析它的性能,我们分别看它的最好情况,最坏情况,以及空间方面的内容。

最好情况

对于快排来说,本质上就是在分治,每次递归,将一个基准点元素归位,同时将基准点元素作为分割点,将原序列分为两个部分,一侧大于基准点,一侧则小于。
若每次递归基准点两侧分割都是均匀的,对于具有16个元素的序列来说,
第一趟快排,{16}需要做15次比较,若干次换位。
第二趟快排,{7}{8}需要做6+7=13次比较。
第三趟快排,{3}{3}{3}{4}需要做2+2+2+4=10次比较。
第四趟快排,{1}{1}{1}{1}{1}{1}{1}{2}需要做1次比较。
此时整个快排就结束了。
说起来,如果说每次递归都可以将原序列分为两个均匀的部分,则一共要进行log2(n+1)(取上界值)此递归,再这么多次递归过程中,每趟比较n-2^n+1次,通过指数递减的方式做到——最后一趟时仅仅发生一次比较。
以上就是快排的最好情况。

最坏情况

依然通过快速排序的原理来分析。
对于最好情况,我们进行log2(n+1)(取上界值)次递归,对于最坏情况,我们让递归次数达到最大,每趟递归所需要比较的次数也达到最大。自然就是最坏情况了。
{1,2,3,4,5}
第一趟:比较5-1=4个元素
第二趟:比较5-2=3个元素
第三趟:比较5-3=2个元素
第四趟:比较5-4=1个元素
其实想象一下,这时的情况类似于一颗右偏的二叉树,每个结点仅有右子节点的那种。
当逆序的时候,其实类似。

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

推荐阅读更多精彩内容

  • 前言 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想--...
    fjytqiu阅读 2,218评论 0 3
  • 数据结构与算法——快速排序 快速排序,顾名思义,它速度很快,针对一般应用中各种不同的输入都要比其他排序算法快很多,...
    sunhaiyu阅读 3,265评论 0 3
  • 快速排序算的上目前使用最广泛的算法了,之所以它这么受欢迎,是因为它是原地排序,而且将长度为 N 的数组排序所需的时...
    ghwaphon阅读 1,604评论 2 18
  • 青峰科技19小时前快速排序算法是分治算法技术的一个实例,也称为分区交换排序。快速排序采用递归调用对元素进行排序,是...
    不二王1006阅读 644评论 0 50
  • 早上匆匆走进电梯,电梯里没有人,但有一股淡淡的雪花霜香味留在里面,让早上有点忙碌的心忽然就安静了下来。能留下如此淡...
    七七八八7788阅读 406评论 0 1