算法(一)之排序算法(六)——快速排序(QuickSort)

快速排序是八大排序算法之一,運(yùn)用也是相當(dāng)廣泛。快速排序是分治思想的一種體現(xiàn),分治就是將一個(gè)規(guī)模為N的問(wèn)題分解成K個(gè)規(guī)模較小的問(wèn)題,這些子問(wèn)題相互獨(dú)立且與原問(wèn)題性質(zhì)相同。求出子問(wèn)題的解,就可得到原問(wèn)題的解。

比如給定一組數(shù)據(jù)[31, 68, 45, 90, 23, 39, 54, 12, 87, 76],我們用快速排序的思想來(lái)對(duì)這組數(shù)據(jù)進(jìn)行排序。

現(xiàn)在我們使用圖解來(lái)分析它的排序步驟:

(1)第一步:定義兩個(gè)指針low和high,low指針指向數(shù)組的第一個(gè)位置,high指針指向數(shù)組中的最后一個(gè)位置。并且用一個(gè)temp變量來(lái)存儲(chǔ)第一個(gè)位置的數(shù)據(jù),即temp=31。

(2)第二步:我們定義一個(gè)指針移動(dòng)方向,先從右往左移動(dòng),即先移動(dòng)high指針。先用high指針上的數(shù)據(jù)和temp進(jìn)行比較,如果high指針上的數(shù)據(jù)大于temp,那就一直往左邊移動(dòng)high指針。直到high指針上的數(shù)據(jù)比temp小時(shí),high指針才停止移動(dòng)。

(3)第三步:現(xiàn)在出現(xiàn)了high指針上的數(shù)據(jù)小于了temp,即array[high] < temp,即(12 < 31)。我們就要把high指針指向的數(shù)據(jù)放到low指針的位置上; high指針停止移動(dòng),然后改變指針移動(dòng)方向,low指針向右移動(dòng)1位。


(4)第四步:low指針向右移動(dòng)過(guò)程中如果array[low]>temp,就把low上面對(duì)應(yīng)的數(shù)據(jù)放到array[high]上;并且low指針不動(dòng),改變指針移動(dòng)方向,high指針向前移動(dòng)一位。

(5)根據(jù)這樣的規(guī)律一直找下去,直到兩個(gè)指針重合,把temp的數(shù)據(jù)放到重合位置上面。


(5)這樣一輪下來(lái)之后,我們就針對(duì)放置temp數(shù)據(jù)的位置的左右兩邊進(jìn)行快速排序,即使用遞歸。

說(shuō)了這么多我也不知道清沒(méi)清楚,最后還是回到代碼上來(lái)處理:

  //begin和end是傳入數(shù)組array的頭尾兩個(gè)下標(biāo)
  public static void quickSort(int[] array,int begin,int end){
    if(end <= begin){   
        return;
    }

    //step1:定義兩個(gè)指針下標(biāo)指向數(shù)組兩端,并把開(kāi)始指針處的數(shù)據(jù)存儲(chǔ)起來(lái)
    int low = begin;
    int high = end;
    int temp = array[begin];

    //step2:定義兩個(gè)指針的移動(dòng)
    boolean direction = true;

    L1:
    while(low < high){
        if(direction) {      //高位指針向左移動(dòng)

            for (int i = high; i > low; i--) {
                if (array[i] <= temp) {
                    array[low++] = array[i];  //把這個(gè)小的數(shù)放到低位指針的位置,并且低位指針向右移動(dòng)1位
                    high = i;                 //并修改高位指針的位置,讓其放置在滿(mǎn)足if條件的i上
                    direction = !direction;     //改變指針移動(dòng)
                    continue L1;
                }
            }
            high = low;                 //最后兩個(gè)位置重合即可跳出循環(huán)

        }else{

            for(int i=low;i<high;i++){
                if(array[i] >= temp){
                    array[high--] = array[i];
                    low = i;
                    direction = !direction;
                    continue L1;
                }
            }
            low = high;

        }
    }

    //step3:把temp放到兩個(gè)指針重合的位置
    array[low] = temp;
    //array[high] = temp;

    //step4:把放置temp數(shù)據(jù)的左右兩邊繼續(xù)進(jìn)行快速排序,這很類(lèi)似二叉樹(shù)的前序遍歷
    quickSort(array,begin,low-1);    
    quickSort(array,low+1,end);
}

快速排序的應(yīng)用場(chǎng)景:源數(shù)據(jù)是數(shù)據(jù)量大并且是順序存儲(chǔ)結(jié)構(gòu)使用快速排序效率最高。
短處:
(1)數(shù)據(jù)中有大量重復(fù)數(shù)據(jù)的時(shí)候性能不好;
(2)數(shù)據(jù)是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的時(shí)候,性能下降嚴(yán)重。

那數(shù)據(jù)是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的時(shí)候我們用什么排序呢?下篇文章再進(jìn)行分析。

小白筆記,如有錯(cuò)誤歡迎指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,211評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,740評(píng)論 0 15
  • 最常見(jiàn)的七大排序算法,整理了下,包括時(shí)間復(fù)雜度和空間復(fù)雜度都做一個(gè)詳細(xì)的解說(shuō),希望對(duì)需要的人能有所幫助。 /** ...
    PapiAP閱讀 352評(píng)論 0 2
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,764評(píng)論 0 33
  • 好長(zhǎng)時(shí)間沒(méi)寫(xiě)看片筆記了,當(dāng)然是因?yàn)樽罱χ夜ぷ鳎瑳](méi)時(shí)間看片。隔了半個(gè)月,看了兩部,記錄一下小感受吧 《美女與野獸...
    北方小生閱讀 580評(píng)論 0 2