第二部分--排序和順序統(tǒng)計學-第7章--快速排序

說明:該系列博客整理自《算法導論(原書第二版)》,但更偏重于實用景殷,所以晦澀偏理論的內容未整理溅呢,請見諒。另外本人能力有限猿挚,如有問題咐旧,懇請指正!

1绩蜻、綜述

????快速排序是一種原地排序算法铣墨,對包含?n?個數(shù)的輸入數(shù)組進行排序,最壞情況運行時間為?Θ?(?n2?)办绝。雖然這個最壞情況運行時間比較差踏兜,但快速排序通常是用于排序的最佳的實用選擇专酗,這是因為其平均性能相當好:期望的運行時間為?Θ?(?n?lg?n?)胀葱,且?Θ?(?n?lg?n?)記號中隱含的常數(shù)因子很小迁霎。由于快速排序是一種原地排序,所以在虛存環(huán)境中也能很好的工作昔驱。

2、不隨機快速排序(平均情況下的時間復雜度相對較高)

????像合并排序一樣上忍,快速排序也是基于分治模式的骤肛。下面是對一個子數(shù)組?A?[?p?..?r?]快速排序的過程纳本,符合分治過程的三個步驟:

? ? ? ? 1)、分解:數(shù)組?A?[?p?..?r?]被劃分成兩個(可能為空)子數(shù)組?A?[?p?..?q?- 1 ]和?A?[?q?+ 1 ..?r?]腋颠,使得?A?[?p?..?q?- 1 ]中的每一個元素都小于等于?A?[?q?]繁成,而且,A?[?q?]小于等于?A?[?q?+ 1 ..?r?]中的元素淑玫。下標?q?也在這個劃分過程中計算得出巾腕。

? ? ? ? 2)、解決:通過遞歸調用絮蒿,對子數(shù)組?A?[?p?..?q?- 1 ]和?A?[?q?+ 1 ..?r?]進行快速排序尊搬。

? ? ? ? 3)、合并:因為兩個子數(shù)組是就地排序的土涝,將它們合并不需要操作佛寿,整個數(shù)組?A?[?p?..?r?]已排序。

????????下面的過程實現(xiàn)了快速排序:

????????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?過程但壮,它對子數(shù)組?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)弹渔,并圍繞它來劃分子數(shù)組。在第3行到第6行中循環(huán)的每一輪迭代開始時验残,對于任何數(shù)組下標?k?捞附,有

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

????????????????如果?i?+ 1 <=?k?<=?j?- 1您没,則?A?[?k?] >?x

????????????????如果?k?=?r?鸟召,則?A?[?k?] =?x

????????下圖總結了這一結構。過程?PARTITION?作用于子數(shù)組?A?[?p?..?r?]中得到四個區(qū)域氨鹏。?A?[?p?..?i?]中的各個值都小于等于?x?欧募,?A?[?i?+ 1 ..?j?- 1 ]中的值都大于?x?,?A?[?r?] =?x?仆抵。?A?[?j?..?r?- 1 ]中的值可以是任何值跟继。

3、快速排序的性能

????快速排序的運行時間與劃分是否對稱有關镣丑,而“劃分是否對稱”又與選擇了哪一個元素來進行劃分有關舔糖。如果劃分是對稱的,那么本算法從漸近意義上來講莺匠,就和歸并排序算法一樣快金吗;如果劃分是不對稱的,那么本算法漸近上就和插入排序一樣慢。下面我們討論劃分為對稱和不對稱時快速排序的性能摇庙。

? ? 1)旱物、最壞情況劃分

????????快速排序的最壞情況劃分發(fā)生在劃分過程產生的兩個區(qū)域分別包含?n?- 1個元素和1個0元素的時候。假設算法的每一次遞歸調用都出現(xiàn)了這種不對稱劃分卫袒。劃分的時間代價為?Θ?(?n?)宵呛。對一個大小為0的數(shù)組進行遞歸調用后,返回?T?( 0 ) =?Θ?( 1 )夕凝,故算法的運行時間為?T?(?n?) =?T?(?n?- 1 ) +?Θ?(?n?)宝穗。

????????從直觀上看,如果將每一層遞歸的代價加起來迹冤,就可以得到一個算術級數(shù)讽营,其和值的量級為Θ?(?n2?)。利用代換法泡徙,可以比較直接的證明遞歸式T?(?n?) =?T?(?n?- 1 ) +?Θ?(?n?)的解為T?(?n?) =?Θ?(?n2?)橱鹏。

? ??????因此,如果在算法的每一層上遞歸上堪藐,劃分都是最大程度不對稱莉兰,那么算法的運行時間就是Θ?(?n2?)。即礁竞,快速排序算法的最壞情況運行時間并不比插入排序好糖荒。此外,當輸入數(shù)組已經(jīng)完全排好序時模捂,快速排序的運行時間為Θ?(?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記號中隱含的常數(shù)因子要略大一些。如何好壞交替呢品山?需要隨機的選取選擇?x?作為?主元?(pivot element)胆建,而不是像不隨機快速排序那樣?x 一直等于 A?[?r?]。隨機快速排序在下面講解肘交。

4笆载、隨機快速排序

? ? 在探討快速排序的平均性態(tài)過程中,我們已經(jīng)假定輸入數(shù)據(jù)的所有排列都是等可能的涯呻,但在工程中凉驻,這個假設并不是總是成立的。所以复罐,我們需要向算法中加入隨機化的成分涝登,以便于對于所有輸入均能獲得很好的平局情況性能。

? ??隨機劃分使用?隨機取樣?(random sampling)的隨機化技術效诅,從子數(shù)組?A?[?p?..?r?]中隨機選擇一個元素并與?A?[?r?]互換胀滚,因為主元是隨機選擇的,我們期望在平均情況下乱投,對輸入數(shù)組的劃分能夠比較對稱咽笼。

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)

? ??快速排序算法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末篡腌,一起剝皮案震驚了整個濱河市褐荷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘹悼,老刑警劉巖叛甫,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杨伙,居然都是意外死亡其监,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門限匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖苦,“玉大人,你說我怎么就攤上這事⌒坷” “怎么了贮庞?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長究西。 經(jīng)常有香客問我窗慎,道長,這世上最難降的妖魔是什么卤材? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任遮斥,我火速辦了婚禮,結果婚禮上扇丛,老公的妹妹穿的比我還像新娘术吗。我一直安慰自己,他們只是感情好帆精,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布较屿。 她就那樣靜靜地躺著,像睡著了一般实幕。 火紅的嫁衣襯著肌膚如雪吝镣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天昆庇,我揣著相機與錄音末贾,去河邊找鬼。 笑死整吆,一個胖子當著我的面吹牛拱撵,可吹牛的內容都是我干的。 我是一名探鬼主播表蝙,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拴测,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了府蛇?” 一聲冷哼從身側響起集索,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汇跨,沒想到半個月后务荆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡穷遂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年函匕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚪黑。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡盅惜,死狀恐怖中剩,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情抒寂,我是刑警寧澤结啼,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蓬推,受9級特大地震影響妆棒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜沸伏,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望动分。 院中可真熱鬧毅糟,春花似錦、人聲如沸澜公。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坟乾。三九已至迹辐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甚侣,已是汗流浹背明吩。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殷费,地道東北人印荔。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像详羡,于是被迫代替她去往敵國和親仍律。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容