[算法詳解][快速排序]Quick Sort



【基本思想】

Divide and Conquer分治思想
將原問(wèn)題分成若干規(guī)模更小,但結(jié)構(gòu)相似的小問(wèn)題媳拴。遞歸解決子問(wèn)題巩那,再把子問(wèn)題的解組合為原問(wèn)題的解捻艳。

【步驟】

  1. 基準(zhǔn)。選取一個(gè)元素作為基準(zhǔn)
  2. 分區(qū)。將小于/大于基準(zhǔn)的點(diǎn)分別放置在兩邊黎做,分區(qū)結(jié)束后蝙砌,基準(zhǔn)所在的位置即為它的最終位置
  3. 對(duì)基準(zhǔn)左右兩邊的數(shù)據(jù)集重復(fù)步驟1&2阳堕,知道所有子數(shù)據(jù)集只剩一個(gè)元素為止

【實(shí)例分析】

現(xiàn)有數(shù)組 Arr = [6 1 2 7 9 3 4 5 10 8]

  1. 選擇基準(zhǔn),方便起見(jiàn)择克,選擇第一個(gè)6
  2. 交換基準(zhǔn)外的元素
    兩個(gè)變量 i 和 j恬总,分別指向序列最左邊和最右邊i=0, j=9;
    (先移動(dòng)j,知道i j相遇)
    j 一步一步地向左挪動(dòng)(即 j--)肚邢,直到找到一個(gè)小于 6 的數(shù)停下來(lái);
    i 再一步一步向右挪動(dòng)(即 i++)壹堰,直到找到一個(gè)數(shù)大于 6 的數(shù)停下來(lái);
    --第一次交換--
    image

    image

    [6 1 2 5 9 3 4 7 10 8]
    --“探測(cè)”繼續(xù)--
    i,j繼續(xù)移動(dòng)骡湖,j到了4位置贱纠,i到了9位置,交換


    6 1 2 5 4 3 9 7 10 8
    --“探測(cè)”繼續(xù)--
    j 繼續(xù)向左挪動(dòng)谆焊,他發(fā)現(xiàn)了 3浦夷;i 繼續(xù)向右移動(dòng),此時(shí)哨兵 i 和哨兵 j 相遇了罐孝。探索結(jié)束肥缔。
  3. 交換基準(zhǔn)
    將基準(zhǔn)數(shù) 6 和 3 進(jìn)行交換。



    3 1 2 5 4 6 9 7 10 8
  4. 拆分序列,繼續(xù)探索
    以 6 為分界點(diǎn)拆分成了兩個(gè)序列姑宽,左邊的序列是“3 1 2 5 4”,右邊的序列是“ 9 7 10 8 ”舵变。接下來(lái)還需要分別處理這兩個(gè)序列。
    3 1 2 5 4 ==> 2 1 3 5 4
    2 1 ==> 1 2 5 4 ==> 4 5

    【偽代碼】

    【JAVA代碼實(shí)現(xiàn)】
public static void main(String[] args)
   {
      // TODO Auto-generated method stub
      int[] arr = {6,1,2,7,9,3,4,5,10,8};
      quick_sort(arr, 0, arr.length-1);
      for(int i = 0; i < arr.length; i++) {
         System.out.print(arr[i] + " ");
      }

   }
   public static void quick_sort(int[] arr, int l, int r) {
      if(l < r) {
         int i = l+1, j = r;
         int p = arr[l];
         while(i <= j) {
            while(i <= j && arr[i] <= p) {
               i = i+1;
            }
            while(i <= j && arr[j] > p) {
               j = j-1;
            }
            if(i < j) {
               int tmp = arr[i];
               arr[i] = arr[j];
               arr[j] = tmp;
            }
         }
         if(l < j) {
            int tmp = arr[l];
            arr[l] = arr[j];
            arr[j] = tmp;
            quick_sort(arr, l, j-1);
         }
        if(j < r) {
            quick_sort(arr, j+1, r);
         }
      }
   }
==>1 2 3 4 5 6 7 8 9 10 

【性能分析】

快速排序的時(shí)間性能取決于快速排序遞歸的深度赊豌,可以用遞歸樹(shù)來(lái)描述遞歸算法的執(zhí)行情況绵咱。
1. 最優(yōu)
時(shí)間復(fù)雜度為O(nlogn)
最優(yōu)的情況,每次Partition都劃分得很均勻艾恼。遞歸樹(shù)的深度就為.logn.+1(.x.表示不大于x的最大整數(shù))麸锉,需要遞歸logn次,時(shí)間為T(mén)(n)
T(n)≤2T(n/2) +n花沉,T(1)=0
T(n)≤2(2T(n/4)+n/2) +n=4T(n/4)+2n
T(n)≤4(2T(n/8)+n/4) +2n=8T(n/8)+3n
……
T(n)≤nT(1)+(log2n)×n= O(nlogn)
2. 最壞
時(shí)間復(fù)雜度為O(n^2)
待排序的序列為正序或者逆序,每次劃分只得到一個(gè)比上一次劃分少一個(gè)記錄的子序列磷脯,注意另一個(gè)為空娩脾。如果遞歸樹(shù)畫(huà)出來(lái),它就是一棵斜樹(shù)晦雨。
需要執(zhí)行n‐1次遞歸調(diào)用隘冲,且第i次劃分需要經(jīng)過(guò)n‐i次關(guān)鍵字的比較才能找到第i個(gè)記錄,也就是樞軸的位置
因此比較次數(shù)為


3. 平均
O(nlogn)
設(shè)樞軸的關(guān)鍵字應(yīng)該在第k的位置(1≤k≤n)

4. 空間復(fù)雜度
遞歸造成的棸掠剩空間
最好情況罗珍,遞歸樹(shù)的深度為log2n,其空間復(fù)雜度也就為O(logn)
最壞情況蘸朋,需要進(jìn)行n‐1遞歸調(diào)用扣唱,其空間復(fù)雜度為O(n)
平均情況团南,空間復(fù)雜度也為O(logn)
5. 穩(wěn)定性
由于關(guān)鍵字的比較和交換是跳躍進(jìn)行的炼彪,所以為不穩(wěn)定算法

【應(yīng)用:常見(jiàn)面試題目】

  1. 找出數(shù)組中最小/大的k個(gè)數(shù)
  2. 數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字
  3. 找出數(shù)組中第k個(gè)最小的數(shù)
  4. 荷蘭旗問(wèn)題

參考:
http://wiki.jikexueyuan.com/project/easy-learn-algorithm/fast-sort.html
https://blog.csdn.net/weshjiness/article/details/8660583

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拷橘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冗疮,老刑警劉巖贞奋,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異轿塔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)勾缭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)俩由,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人幻梯,你說(shuō)我怎么就攤上這事∫б。” “怎么了煞躬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)恩沛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芒珠,這世上最難降的妖魔是什么搅裙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任总放,我火速辦了婚禮好爬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘存炮。我一直安慰自己炬搭,他們只是感情好穆桂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布享完。 她就那樣靜靜地躺著灼芭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彼绷。 梳的紋絲不亂的頭發(fā)上茴迁,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音猜旬,去河邊找鬼。 笑死洒擦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熟嫩。 我是一名探鬼主播嘉竟,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼洋侨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舍扰!你這毒婦竟也來(lái)了希坚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤个束,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后茬底,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殿如,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年最爬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爱致。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糠悯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叶沛,到底是詐尸還是另有隱情忘朝,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布溉箕,位于F島的核電站悦昵,受9級(jí)特大地震影響但指,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棋凳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一剩岳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晓铆,春花似錦勺良、人聲如沸骄噪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奏属。三九已至囱皿,卻和暖如春嘱腥,著一層夾襖步出監(jiān)牢的瞬間齿兔,已是汗流浹背分苇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工医寿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靖秩,地道東北人沟突。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓捎稚,卻偏偏與公主長(zhǎng)得像求橄,于是被迫代替她去往敵國(guó)和親罐农。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 親愛(ài)的女兒: 光陰似箭,看到你一天天的成長(zhǎng)父母感到非常的欣慰气筋,你快到12歲的年齡正處于人生理想的奠基階段拆内,作...
    辣姐閱讀 7,211評(píng)論 0 0
  • 有朋友問(wèn)我你2017年做了什么宠默,我不知道該怎么回答他,于是回了一個(gè)尷尬而不失禮貌的微笑抹沪。 我在2017年做了什么融欧?...
    三季稻丨清酒灬閱讀 139評(píng)論 1 1