结合二叉树的快速排序算法分析

1. 示例引出:

对 3,9,1,6,5,4,8,2,10,7 进行从小到大的快速排序

对于第一次遍历,如下图所示:

第一次遍历的过程

对应的二叉树结果是:


用二叉树表示第一次遍历的结果

那么经过后几次遍历比较可以得到如下二叉树:


用二叉树表示排序结果

这时我们可以计算一下我们的快速排序算法进行了多少次比较:

1*2+2*3+3*3+4=21,即每个节点到根结点的距离之和。

2. 快排算法复杂性分析:

由上例可知,快排可视为一个二叉树构建的过程,那么这个二叉树构建的速度就决定了我们快排的效率。可以确定的是,对于同样的数据元素在不同的原始排列条件下,构建的二叉树越矮,则排序效率越高。

通过这一理论,我们可以更具体的分析其不同情况下的时间复杂度:

A. 对于最理想的状态,构建出的是一颗完全二叉树。

完全二叉树满足如下公式:

2*叶子到根的距离之和=顶点数+顶点到根的距离之和-1

对于深度为h的完全二叉树,若为满二叉树,比较次数为:\sum_{i=1}^h(i-1)2^{i-1}=(h-2)2^{h}+2

这里的叶子数量m与深度h的关系:

2^{h-2}+1\leqslant m\leqslant 2^{h-1}


深度一定时,完全二叉树叶子数的两种情况

那么叶子到根的距离d为:

h-2\leqslant d\leqslant h-1

即,log_2(m-1)\leqslant d\leqslant \log_2(m)

由于d为整数,即可认为\lfloor log_2(m)\rfloor \leqslant d \leqslant \lceil \log_2(m) \rceil

而对于完全二叉树来说,叶子数m,与内点(带有叶子节点的顶点)数p的关系为p=m-1,则顶点数n=2m-1

那么由上述公式可得:

比较次数=顶点到根的距离=2*叶子到根的距离-顶点数+1=m*log_2(m)-n+1\approx n\log_2(\frac{n}{2})-n+1

即,n\log_2(n)-2n+1,时间复杂度为:O(n\log(n))

B. 对于最糟糕的状态,构建出的是一张线性表。

那么若节点数为n,则:

比较次数=\sum_{i=0}^{n-1}i=\frac{n(n-1)}{2},即时间复杂度为:O(n^2)


结果为线性表时的情况

C. 对于平均情况而言,我们将T_n作为对n个对象进行快速分类时平均比较次数,在取得排序结果后,选取第k个元素为分割标准,平均比较次数为:(n-1)+T_{k-1}+T_{n-k}

由于分割标准的选取概率完全相同,那么可以得到平均比较次数为:

平均比较次数=T_n=\frac{1}{n}\sum_{k=1}^n(n-1+T_{k-1}+T_{n-k})

T_0=0\ \ T_1=0\ \ T_2=1

由于这里的\sum_{k=1}^nT_{k-1}=\sum_{t=0}^{n-1}T_t,\ k=t-1,以及\sum_{k=1}^nT_{n-k}=\sum_{t=n-1}^0T_t=\sum_{t=0}^{n-1}T_t,\ k=t-1

T_n=n-1+\frac{2}{n}\sum_{k=0}^{n-1}T_k

T_0=0\ \ T_1=0\ \ T_2=1

nT_n=n(n-1)+2\sum_{k=0}^{n-1}T_k,以及(n+1)T_{n+1}=(n+1)n+2\sum_{k=0}^{n}T_k,得:

S_n=\frac{1}{n+1}T_n,得:

S_n=2\sum_{i=0}^{n-1}(\frac{2}{i+1}-\frac{1}{i+2})

i=k-1,得:\sum_{i=0}^{n-1}\frac{2}{i+1} = 2\sum_{k=1}^{n}\frac{1}{k}

i=k-2,得:\sum_{i=0}^{n-1}\frac{1}{i+2} = \sum_{k=2}^{n+1}\frac{1}{k}

整理得:

S_n=2 \sum_{k=2}^{n} \frac{1}{k} + 4 - \frac{2}{n+1}

\sum_{k=2}^n\frac{1}{k}<\int_{1}^{n}\frac{1}{x}dx=\ln(n),故S_n<2\ln(n)+O(1)

则:

T_n<2(n+1)\ln(n)+O(n)

即,T_n\sim O(n\log(n))

综合来看,快排的时间复杂度最理想状态与最糟糕状态分别为O(n\log(n))O(n^2),但是对于一般随机情况而言时间复杂度仍为O(n\log(n))


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

推荐阅读更多精彩内容