算法 - 快排序

// 分區(qū)
// 將比pivot小的左移展姐,比pivot大的右移。
// 返回pivot的位置
//
func partition(data []int, left, right int) int {
    // 交換數(shù)據(jù)的位置
    store := left
    for j := left; j < right; j++ {
        // pivot為right位置的值
        if data[j] <= data[right] {
            // 交換數(shù)據(jù)
            if store != j {
                data[store], data[j] = data[j], data[store]
            }
            store++
        }
    }
    // 將基準(zhǔn)元素放置到最后的正確位置上
    data[store], data[right] = data[right], data[store]
    return store
}

// 遞歸調(diào)用
//
func quickSort(data []int, left, right int) {
    if left < right {
        idx := partition(data, left, right)
        quickSort(data, left, idx-1)
        quickSort(data, idx+1, right)
    }
}

// 對(duì)data進(jìn)行正向排序
// 1串结、在數(shù)據(jù)集之中第岖,選擇中間元素作為基準(zhǔn)(pivot)。
// 2霞掺、所有小于基準(zhǔn)的元素坛掠,都移到基準(zhǔn)的左邊耳璧;所有大于基準(zhǔn)的元素辅鲸,都移到基準(zhǔn)的右邊格郁。
// 這個(gè)操作稱為分區(qū) (partition) 操作,分區(qū)操作結(jié)束后独悴,基準(zhǔn)元素所處的位置就是最終排序后它的位置例书。
// 3、對(duì)基準(zhǔn)左邊和右邊的兩個(gè)子集刻炒,不斷重復(fù)第1步和第2步决采,直到所有子集只剩下一個(gè)元素為止。
// 難度系數(shù) O(n^2)
// 不穩(wěn)定排序
//
func QuickSort(data []int) {
    quickSort(data, 0, len(data)-1)
}
  • 測(cè)試

func TestQuickSort(t *testing.T) {
    data := []int{0, 2, 4, 6, 8, 10, 9, 7, 5, 3, 1,8}
    fmt.Println("sort before", data)
    sort2.QuickSort(data)
    fmt.Println("sort after", data)
}
  • 分析

sort before [0 2 4 6 8 10 9 7 5 3 1 8]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
0 0 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 0 8 true
1 1 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 2 8 true
2 2 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 4 8 true
3 3 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 6 8 true
4 4 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 8 8 true
5 5 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 10 8 false
5 6 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 9 8 false
5 7 0 11 [0 2 4 6 8 10 9 7 5 3 1 8] 7 8 true
6 8 0 11 [0 2 4 6 8 7 9 10 5 3 1 8] 5 8 true
7 9 0 11 [0 2 4 6 8 7 5 10 9 3 1 8] 3 8 true
8 10 0 11 [0 2 4 6 8 7 5 3 9 10 1 8] 1 8 true
9 0 11 [0 2 4 6 8 7 5 3 1 8 9 10]
quickSort left 0 right 11 idx 9 data [0 2 4 6 8 7 5 3 1 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
0 0 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 0 1 true
1 1 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 2 1 false
1 2 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 4 1 false
1 3 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 6 1 false
1 4 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 8 1 false
1 5 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 7 1 false
1 6 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 5 1 false
1 7 0 8 [0 2 4 6 8 7 5 3 1 8 9 10] 3 1 false
1 0 8 [0 1 4 6 8 7 5 3 2 8 9 10]
quickSort left 0 right 8 idx 1 data [0 1 4 6 8 7 5 3 2 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
2 2 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 4 2 false
2 3 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 6 2 false
2 4 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 8 2 false
2 5 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 7 2 false
2 6 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 5 2 false
2 7 2 8 [0 1 4 6 8 7 5 3 2 8 9 10] 3 2 false
2 2 8 [0 1 2 6 8 7 5 3 4 8 9 10]
quickSort left 2 right 8 idx 2 data [0 1 2 6 8 7 5 3 4 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
3 3 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 6 4 false
3 4 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 8 4 false
3 5 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 7 4 false
3 6 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 5 4 false
3 7 3 8 [0 1 2 6 8 7 5 3 4 8 9 10] 3 4 true
4 3 8 [0 1 2 3 4 7 5 6 8 8 9 10]
quickSort left 3 right 8 idx 4 data [0 1 2 3 4 7 5 6 8 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
5 5 5 8 [0 1 2 3 4 7 5 6 8 8 9 10] 7 8 true
6 6 5 8 [0 1 2 3 4 7 5 6 8 8 9 10] 5 8 true
7 7 5 8 [0 1 2 3 4 7 5 6 8 8 9 10] 6 8 true
8 5 8 [0 1 2 3 4 7 5 6 8 8 9 10]
quickSort left 5 right 8 idx 8 data [0 1 2 3 4 7 5 6 8 8 9 10]
-----
partition store j left right data data[j] data[right] data[j]<=data[right]
5 5 5 7 [0 1 2 3 4 7 5 6 8 8 9 10] 7
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坟奥,一起剝皮案震驚了整個(gè)濱河市映穗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贮泞,老刑警劉巖居夹,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異管行,居然都是意外死亡厨埋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門捐顷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荡陷,“玉大人,你說我怎么就攤上這事迅涮》显蓿” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵叮姑,是天一觀的道長唉地。 經(jīng)常有香客問我,道長传透,這世上最難降的妖魔是什么耘沼? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮朱盐,結(jié)果婚禮上群嗤,老公的妹妹穿的比我還像新娘。我一直安慰自己兵琳,他們只是感情好狂秘,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躯肌,像睡著了一般者春。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羡榴,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天碧查,我揣著相機(jī)與錄音,去河邊找鬼校仑。 笑死忠售,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的迄沫。 我是一名探鬼主播稻扬,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼羊瘩!你這毒婦竟也來了泰佳?” 一聲冷哼從身側(cè)響起盼砍,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逝她,沒想到半個(gè)月后浇坐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔宛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年近刘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臀晃。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡觉渴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徽惋,到底是詐尸還是另有隱情案淋,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布险绘,位于F島的核電站踢京,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隆圆。R本人自食惡果不足惜漱挚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渺氧。 院中可真熱鬧旨涝,春花似錦、人聲如沸侣背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贩耐。三九已至弧腥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潮太,已是汗流浹背管搪。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铡买,地道東北人更鲁。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像奇钞,于是被迫代替她去往敵國和親澡为。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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