算法——快速排序

有人甚至將快排稱為分治法,但分治更多應該指明是一種思想,而非具體的排序算法。
對于快速排序的內容,我這樣概括:每趟排序將一個基準點歸位,并且將原序列依照基準點分為兩個部分。

實例

對于下面的序列:

{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閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容

  • 前言 快速排序由于排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被采用,再加上快速排序思想--...
    fjytqiu閱讀 2,230評論 0 3
  • 數據結構與算法——快速排序 快速排序,顧名思義,它速度很快,針對一般應用中各種不同的輸入都要比其他排序算法快很多,...
    sunhaiyu閱讀 3,305評論 0 3
  • 快速排序算的上目前使用最廣泛的算法了,之所以它這么受歡迎,是因為它是原地排序,而且將長度為 N 的數組排序所需的時...
    ghwaphon閱讀 1,617評論 2 18
  • 青峰科技19小時前快速排序算法是分治算法技術的一個實例,也稱為分區交換排序??焖倥判虿捎眠f歸調用對元素進行排序,是...
    不二王1006閱讀 706評論 0 50
  • 早上匆匆走進電梯,電梯里沒有人,但有一股淡淡的雪花霜香味留在里面,讓早上有點忙碌的心忽然就安靜了下來。能留下如此淡...
    七七八八7788閱讀 427評論 0 1