排序算法之快速排序

快速排序

快速排序是一個(gè)非常高效的排序算法戈稿,目前的應(yīng)用非常廣泛, 同時(shí)也是面試的逞冉ⅲ客鞍盗。學(xué)好快速排序需了,能夠?qū)φ业焦ぷ饔泻艽蟮膸椭M瑫r(shí)般甲,也有很多面試題也會(huì)用到這種思想肋乍。

快速排序也是一種分治的思想,但是它于歸并算法更加好是因?yàn)闅w并算法會(huì)用到輔助數(shù)組敷存,其空間復(fù)雜度是O(n). 而快速排序不需要用到新的數(shù)組空間墓造,它的空間復(fù)雜度是O(1).

快速排序的核心是:選定一個(gè)值作為軸心值,然后將數(shù)組分成兩個(gè)部分锚烦,一部分是大于這個(gè)軸心值觅闽,另一部分是小于這個(gè)軸心值的。然后將這個(gè)軸心值前的部分繼續(xù)使用快速排序涮俄,將這個(gè)軸心值的后半部分繼續(xù)使用快速排序蛉拙。直到指剩下了一個(gè)元素的時(shí)候是不需要交換的〕骨祝快速排序非常適用于大數(shù)據(jù)量的排序孕锄,因?yàn)樗炔徽加枚嘤嗟目臻g,又能達(dá)到時(shí)間復(fù)雜度是O(nlogn).

下面睹栖,快速排序的步驟:

image

第一步:選擇最大的index作為軸心

第二步:選擇兩個(gè)指分別指向最左邊左邊和除了軸心的最右邊硫惕。

第三步:兩個(gè)指針?lè)謩e是left和right。左邊的只想低索引野来。右邊的指向高索引恼除。

第四步:當(dāng)左邊的索引的值小于軸心,那就向右移動(dòng)索引曼氛。

第五步:當(dāng)右邊的索引的值大于軸心豁辉,那就向左移動(dòng)索引。

第六步:當(dāng)?shù)谒牟胶偷谖宀蕉疾环蠒r(shí)舀患,交換彼此徽级。

第七步:如果 left >= right, 那么left就是新的軸心的位置,將軸心與之交換聊浅。

代碼示例

def QuickSort(array, left=0, right=None):
    arrayLen = len(array)
    if arrayLen <= 1:
        return array
    if right == None:
        right = arrayLen - 1
    if left < right:
        pivot = partition(array, left, right)
        QuickSort(array, left, pivot - 1)
        QuickSort(array, pivot + 1, right)

def partition(array, left, right):
    pivotValue = array[right]
    i = left
    j = right - 1
    while i < j:
        while j > left and array[j] > pivotValue:
            j -= 1
        while i < right and array[i] <= pivotValue:
            i += 1
        if i < j:
            array[i], array[j] = array[j], array[i]
            i += 1
            j -= 1
    if array[i] > array[right]:
        array[i], array[right] = array[right], array[i]
    return i

if __name__ == '__main__':
    testList = [2, 7, 6, 1, 5, 4, 9, 3]
    QuickSort(testList)
    print(testList)

另一種實(shí)現(xiàn)方式理解會(huì)有偏差餐抢,所以給出大家下面參考,如果能理解下面的代碼低匙,請(qǐng)使用下面的方式編寫快速排序:

image.png

1.選取一個(gè)數(shù)字作為基準(zhǔn)旷痕,可選取末位數(shù)字

2.將數(shù)列第一位開(kāi)始,依次與此數(shù)字比較顽冶,如果小于此數(shù)欺抗,將小數(shù)交換到左邊,最后達(dá)到小于基準(zhǔn)數(shù)的在左邊强重,大于基準(zhǔn)數(shù)的在右邊绞呈,分為兩個(gè)數(shù)組

3.分別對(duì)兩個(gè)數(shù)組重復(fù)上述步驟

代碼示例

def QuickSort(array, left=0, right=None):
    arrayLen = len(array)
    if arrayLen <= 1:
        return array
    if right == None:
        right = arrayLen - 1
    if left < right:
        pivot = partition(array, left, right)
        QuickSort(array, left, pivot - 1)
        QuickSort(array, pivot + 1, right)

def partition(array,left,right):
    i = left-1
    for j in range(left,right):
        if array[j] <= array[right]:
            i += 1
            array[j],array[i] = array[i],array[j]
    array[i+1],array[right] = array[right],array[i+1]
    return i+1

if __name__ == '__main__':
    testList = [2, 7, 6, 1, 5, 4, 9, 3]
    QuickSort(testList)
    print(testList)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贸人,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子佃声,更是在濱河造成了極大的恐慌艺智,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉溉,死亡現(xiàn)場(chǎng)離奇詭異力惯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)召嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門父晶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人弄跌,你說(shuō)我怎么就攤上這事甲喝。” “怎么了铛只?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵埠胖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我淳玩,道長(zhǎng)直撤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任蜕着,我火速辦了婚禮谋竖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘承匣。我一直安慰自己蓖乘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般殖卑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上些侍,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音政模,去河邊找鬼岗宣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛览徒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颂龙,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼习蓬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纽什!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起躲叼,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芦缰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后枫慷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體让蕾,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年或听,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了探孝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡誉裆,死狀恐怖顿颅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情足丢,我是刑警寧澤粱腻,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站斩跌,受9級(jí)特大地震影響绍些,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耀鸦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一柬批、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揭糕,春花似錦萝快、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吏口,卻和暖如春奄容,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背产徊。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工昂勒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舟铜。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓戈盈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塘娶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 快速排序是一種劃分交換排序归斤。它采用了一種分治的策略,通常稱其為分治法刁岸。 分治法的基本思想是:將原問(wèn)題分解為若干個(gè)規(guī)...
    黎貝卡beka閱讀 879評(píng)論 0 0
  • 采用分治的思想脏里,首先選取一個(gè)基準(zhǔn)值pivot,然后將小于基準(zhǔn)值的數(shù)放到左邊虹曙,大于基準(zhǔn)值的數(shù)放到右邊迫横。而對(duì)于左邊的部...
    哇哇哇one閱讀 438評(píng)論 0 1
  • 我們來(lái)分析一下基本的思路: 第一次交換:以6為基準(zhǔn),首先j向前移動(dòng)酝碳,直到遇見(jiàn)比這個(gè)基準(zhǔn)6小的第一個(gè)數(shù)為止矾踱,然后i向...
    阿貍404閱讀 2,972評(píng)論 0 2
  • 排序算法之快速排序算法 快速排序思想:選一個(gè)基準(zhǔn)數(shù)將所有的元素都比較一遍,將大于基準(zhǔn)數(shù)的放到基準(zhǔn)數(shù)的右邊击敌,小于它的...
    飛天胖閱讀 460評(píng)論 0 0
  • 在平均狀況下介返,排序n個(gè)元素要O(nlogn)次比較。在最壞狀況下則需要O(n^2)次比較沃斤,但這種狀況并不常見(jiàn)圣蝎。事實(shí)...
    BEYOND黃閱讀 275評(píng)論 0 2