2018-07-11快速排序

快速排序

快速排序(英語(yǔ):Quicksort)泌类,又稱劃分交換排序(partition-exchange sort)爆价,通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分顷蟆,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小蔽莱,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序窿侈,整個(gè)排序過程可以遞歸進(jìn)行饮潦,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

步驟為:

  1. 從數(shù)列中挑出一個(gè)元素,稱為"基準(zhǔn)"(pivot)坞琴,
  2. 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面逗抑,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)剧辐。在這個(gè)分區(qū)結(jié)束之后,該基準(zhǔn)就處于數(shù)列的中間位置邮府。這個(gè)稱為分區(qū)(partition)操作荧关。
  3. 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

遞歸的最底部情形褂傀,是數(shù)列的大小是零或一忍啤,也就是永遠(yuǎn)都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個(gè)算法總會(huì)結(jié)束同波,因?yàn)樵诿看蔚牡╥teration)中鳄梅,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去。

快速排序的分析

快速排序分析
def quick_sort(alist, start, end):
    """快速排序"""

    # 遞歸的退出條件
    if start >= end:
        return

    # 設(shè)定起始元素為要尋找位置的基準(zhǔn)元素
    mid = alist[start]

    # low為序列左邊的由左向右移動(dòng)的游標(biāo)
    low = start

    # high為序列右邊的由右向左移動(dòng)的游標(biāo)
    high = end

    while low < high:
        # 如果low與high未重合未檩,high指向的元素不比基準(zhǔn)元素小戴尸,則high向左移動(dòng)
        while low < high and alist[high] >= mid:
            high -= 1
        # 將high指向的元素放到low的位置上
        alist[low] = alist[high]

        # 如果low與high未重合,low指向的元素比基準(zhǔn)元素小冤狡,則low向右移動(dòng)
        while low < high and alist[low] < mid:
            low += 1
        # 將low指向的元素放到high的位置上
        alist[high] = alist[low]

    # 退出循環(huán)后孙蒙,low與high重合,此時(shí)所指位置為基準(zhǔn)元素的正確位置
    # 將基準(zhǔn)元素放到該位置
    alist[low] = mid

    # 對(duì)基準(zhǔn)元素左邊的子序列進(jìn)行快速排序
    quick_sort(alist, start, low-1)

    # 對(duì)基準(zhǔn)元素右邊的子序列進(jìn)行快速排序
    quick_sort(alist, low+1, end)

alist = [54,26,93,17,77,31,44,55,20]
quick_sort(alist,0,len(alist)-1)
print(alist)

時(shí)間復(fù)雜度

  • 最優(yōu)時(shí)間復(fù)雜度:O(nlogn)
  • 最壞時(shí)間復(fù)雜度:O(n2)
  • 穩(wěn)定性:不穩(wěn)定

從一開始快速排序平均需要花費(fèi)O(n log n)時(shí)間的描述并不明顯悲雳。但是不難觀察到的是分區(qū)運(yùn)算挎峦,數(shù)組的元素都會(huì)在每次循環(huán)中走訪過一次,使用O(n)的時(shí)間合瓢。在使用結(jié)合(concatenation)的版本中坦胶,這項(xiàng)運(yùn)算也是O(n)。

在最好的情況歪玲,每次我們運(yùn)行一次分區(qū)迁央,我們會(huì)把一個(gè)數(shù)列分為兩個(gè)幾近相等的片段。這個(gè)意思就是每次遞歸調(diào)用處理一半大小的數(shù)列滥崩。因此岖圈,在到達(dá)大小為一的數(shù)列前,我們只要作log n次嵌套的調(diào)用钙皮。這個(gè)意思就是調(diào)用樹的深度是O(log n)蜂科。但是在同一層次結(jié)構(gòu)的兩個(gè)程序調(diào)用中,不會(huì)處理到原來數(shù)列的相同部分短条;因此导匣,程序調(diào)用的每一層次結(jié)構(gòu)總共全部?jī)H需要O(n)的時(shí)間(每個(gè)調(diào)用有某些共同的額外耗費(fèi),但是因?yàn)樵诿恳粚哟谓Y(jié)構(gòu)僅僅只有O(n)個(gè)調(diào)用茸时,這些被歸納在O(n)系數(shù)中)贡定。結(jié)果是這個(gè)算法僅需使用O(n log n)時(shí)間。

快速排序演示

快速排序演示

思考:

之前的插入排序和希爾排序可都,都是把序列看成兩組:有序+無序
快排就看某元素直接放在哪里缓待,直接找該元素位置,兩個(gè)游標(biāo)雙面夾擊渠牲。
找一個(gè)low游標(biāo)旋炒,再找一個(gè)high游標(biāo)。
讓low經(jīng)歷過的元素都比54小签杈,high經(jīng)過的元素都比54大瘫镇。
先把54放在最左邊,讓low游標(biāo)從第一個(gè)走,high游標(biāo)從最后一個(gè)走铣除。
本質(zhì):找出第一個(gè)值作為參照谚咬,兩邊相夾找到這個(gè)元素的正確位置。把整個(gè)序列分成兩個(gè)部分通孽;這個(gè)過程過后序宦,該元素所在位置就是它應(yīng)該在的位置睁壁。

代碼分析:
*如果出現(xiàn)等于的情況背苦,盡量讓等于的那個(gè)值放在目標(biāo)值54的一邊

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市潘明,隨后出現(xiàn)的幾起案子行剂,更是在濱河造成了極大的恐慌,老刑警劉巖钳降,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厚宰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遂填,警方通過查閱死者的電腦和手機(jī)铲觉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吓坚,“玉大人撵幽,你說我怎么就攤上這事〗富鳎” “怎么了盐杂?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)哆窿。 經(jīng)常有香客問我链烈,道長(zhǎng),這世上最難降的妖魔是什么挚躯? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任强衡,我火速辦了婚禮,結(jié)果婚禮上码荔,老公的妹妹穿的比我還像新娘漩勤。我一直安慰自己,他們只是感情好目胡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布锯七。 她就那樣靜靜地躺著,像睡著了一般誉己。 火紅的嫁衣襯著肌膚如雪眉尸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音噪猾,去河邊找鬼霉祸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛袱蜡,可吹牛的內(nèi)容都是我干的丝蹭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坪蚁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼奔穿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敏晤,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贱田,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后嘴脾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體男摧,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年译打,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耗拓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奏司,死狀恐怖乔询,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情结澄,我是刑警寧澤哥谷,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站麻献,受9級(jí)特大地震影響们妥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勉吻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一监婶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧齿桃,春花似錦惑惶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至香到,卻和暖如春鱼冀,著一層夾襖步出監(jiān)牢的瞬間报破,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工千绪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留充易,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓荸型,卻偏偏與公主長(zhǎng)得像盹靴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瑞妇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 快速排序 快速排序(英語(yǔ):Quicksort)踪宠,又稱劃分交換排序(partition-exchange sort)...
    lyh165閱讀 369評(píng)論 0 0
  • 我一直覺得寫代碼也可以寫出藝術(shù)自赔,在不懂畫的人的眼里妈嘹,《向日葵》不過是小孩子的涂鴉柳琢,在懂代碼的人眼里,那看似混亂的字...
    AidenRao閱讀 4,159評(píng)論 9 59
  • 網(wǎng)上看過這樣一個(gè)小故事润脸,還和某人辯論過要不要把精神病人改成木耳柬脸,因?yàn)槟⒐奖緛砭褪腔顫姟⒊瘹獗醒薄⒒钴S的精靈…… 有一個(gè)...
    韋年坤閱讀 314評(píng)論 0 1
  • 文/歲月削 【1】 跟顧城的再次相遇是在放假回家的大巴上爆价。 他一眼認(rèn)出了我垦巴,隔了老遠(yuǎn)沖我揮了揮手,然后從大巴的最后...
    歲月削閱讀 581評(píng)論 0 5
  • 看書铭段,倦了骤宣,走去窗邊看雨。我沒看見你序愚,你卻被我驚擾憔披。忽得飛走,去尋找下一個(gè)躲雨的屋檐爸吮。
    唐人青閱讀 196評(píng)論 0 1