排序算法⑥——快速排序

快速排序

快速排序是由東尼·霍爾所發(fā)展的一種排序算法。在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較度液。在最壞狀況下則需要 Ο(n2) 次比較湾碎,但這種狀況并不常見宙攻。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快介褥,因為它的內(nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實現(xiàn)出來座掘。
快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。
快速排序又是一種分而治之思想在排序算法上的典型應(yīng)用呻顽。本質(zhì)上來看雹顺,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。
快速排序的名字起的是簡單粗暴廊遍,因為一聽到這個名字你就知道它存在的意義嬉愧,就是快,而且效率高喉前!它是處理大數(shù)據(jù)最快的排序算法之一了没酣。雖然 Worst Case 的時間復雜度達到了 O(n2)王财,但是人家就是優(yōu)秀,在大多數(shù)情況下都比平均時間復雜度為 O(n logn) 的排序算法表現(xiàn)要更好裕便,可是這是為什么呢绒净,我也不知道。好在我的強迫癥又犯了偿衰,查了 N 多資料終于在《算法藝術(shù)與信息學競賽》上找到了滿意的答案:

  • 快速排序的最壞運行情況是 O(n2)挂疆,比如說順序數(shù)列的快排。但它的平攤期望時間是 O(nlogn)下翎,且 O(nlogn) 記號中隱含的常數(shù)因子很小缤言,比復雜度穩(wěn)定等于 O(nlogn) 的歸并排序要小很多。所以视事,對絕大多數(shù)順序性較弱的隨機數(shù)列而言胆萧,快速排序總是優(yōu)于歸并排序。

1. 算法步驟

  • 從數(shù)列中挑出一個元素俐东,稱為 "基準"(pivot);
  • 重新排序數(shù)列跌穗,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)虏辫。在這個分區(qū)退出之后蚌吸,該基準就處于數(shù)列的中間位置。這個稱為分區(qū)(partition)操作砌庄;
  • 遞歸地(recursive)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序套利;
quickSort.gif

2.代碼

#include <stdio.h>

void
sort(int *data, int left, int right)
{
    if (left >= right)
        return;

    int i = left;
    int j = right;
    int key = data[left];

    while (i < j) {
        while (i < j && key <= data[j]) {
            j --;
        }
        data[i] = data[j];

        while (i < j && key >= data[i]) {
            i ++;
        }
        data[j] = data[i];
    }

    data[i] = key;

    sort(data, left, i - 1);
    sort(data, i + 1, right);
}

int
quick_sort(int *data, int length)
{
    sort(data, 0, length - 1);
}

int
main()
{
    int arr[] = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70};
    int len = (int) sizeof(arr) / sizeof(*arr);
    quick_sort(arr, len);
    int i;
    for (i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

轉(zhuǎn)載于菜鳥教程


2020.10.29 10:24 深圳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹤耍,隨后出現(xiàn)的幾起案子肉迫,更是在濱河造成了極大的恐慌,老刑警劉巖稿黄,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喊衫,死亡現(xiàn)場離奇詭異,居然都是意外死亡杆怕,警方通過查閱死者的電腦和手機族购,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵珍,“玉大人寝杖,你說我怎么就攤上這事』ゴ浚” “怎么了瑟幕?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我只盹,道長辣往,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任殖卑,我火速辦了婚禮站削,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孵稽。我一直安慰自己许起,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布菩鲜。 她就那樣靜靜地躺著街氢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睦袖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天荣刑,我揣著相機與錄音馅笙,去河邊找鬼。 笑死厉亏,一個胖子當著我的面吹牛董习,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爱只,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼皿淋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恬试?” 一聲冷哼從身側(cè)響起窝趣,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎训柴,沒想到半個月后哑舒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡幻馁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年洗鸵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仗嗦。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡膘滨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稀拐,到底是詐尸還是另有隱情火邓,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站贡翘,受9級特大地震影響蹈矮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸣驱,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一泛鸟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踊东,春花似錦北滥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坚冀,卻和暖如春济赎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背记某。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工司训, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人液南。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓壳猜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滑凉。 傳聞我的和親對象是個殘疾皇子统扳,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348