Java排序之快速排序

前言

快速排序作為排序算法的王者,我們沒有理由不掌握它

引用自大話數(shù)據(jù)結(jié)構(gòu).png
  • 快速排序的基本思想:
    通過一趟排序?qū)⒋判蛴涗浄指畛瑟毩⒌膬刹?其中一部分記錄的關(guān)鍵字均比另一部分記錄的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進行排序,以達到整個序列有序的目的.

  • 快速排序的快速理解:
    把數(shù)據(jù)分成左右兩部分,左邊的所有數(shù)據(jù)都比右邊數(shù)據(jù)小, 再把左右兩部分的數(shù)據(jù)按同樣的方法排序. 很明顯快速排序是不穩(wěn)定的,排序的結(jié)果次序可能不一致.

舉例分析

int s[] = {52,78,12,99,5,18,80,32,66};

快速排序示意圖.png

畫了一張很簡單的圖, 力求簡單.每個格子想象成一個待挖的坑.

第一步: 我們先隨便從數(shù)組中拿一個數(shù)據(jù)作為基準數(shù)p.便于演示,就用s[0] 吧,即p=s[0] . 注意,我們在s[0]處拿了一個數(shù)據(jù),我們就想象從數(shù)組s中挖了一個坑,而且這個坑的位置就是s[0],下面我們來看看如何填坑

第二步:找 s[k] < p :從索引K的結(jié)尾處開始向前找. 找比s[0] (即p)小的數(shù).如圖中的綠色箭頭方向,標號①表示綠色查找優(yōu)先紅色查找,很明顯s[7]=32 < s[0]=52 , 此時我們把32挖出來去填s[0]的坑, 讓s[0]=s[7] , 所以此時s[0]為32,就是說我們把第一個坑填了. 但是有一個新坑k[7],此時的數(shù)據(jù)順序:
32,78,12,99,5,18,80,32,66

第三步:找 s[i] > p :從索引 i 的開始處從前向后找.找比s[0] (即p)大的數(shù).如圖中的紅色箭頭方向.我們看到 s[1] = 78 > p=52 .所以我們挖出s[1]的數(shù)據(jù)放到上一步的坑中,就是k[7]了.此時我們的新坑i[1] , 讓 s[7]=s[1],此時的數(shù)據(jù)順序:
32,78,12,99,5,18,80,78,66

我們在第二步中得到了K=7,在第三步中得到了i=1.那么在下一輪的查找中k從6開始,然后i從2開始.這樣重復(fù)執(zhí)行第二步然后第三步,直到 i = k . 這樣就完成了左邊的數(shù)據(jù)都是小于右邊的數(shù).之后用同樣的方法從第一步開始分別對左右部分的數(shù)據(jù)進行排序,得到的就是最終的結(jié)果

Java代碼示例

原理講完了,我們來擼一下java的實現(xiàn).

public void quickSort(int arr[],int sIndex,int eIndex){
        if (sIndex < eIndex) {
            int p = arr[sIndex] , i = sIndex , k = eIndex;
            while (i < k) {
                while(i < k && arr[k] >= p) // 從右向左找
                    k--;

                if (i < k ) arr[i++] = arr[k];

                while(i < k && arr[i] < p) // 從左向右找
                    i++;

                if (i < k ) arr[k--] = arr[i];
            }
            arr[i] = p;
            quickSort(arr, sIndex, i - 1); // 遞歸
            quickSort(arr, i + 1, eIndex);
        }
}

結(jié)束

快速排序還有很多優(yōu)化版本,但是基本思想都是類似的,很大程度上取決P的選擇,比如如果P處于數(shù)列的中間,那么就趨于平衡樹,效率會提高.總的來說,快速排序名副其實,我們應(yīng)該好好學(xué)習它.謝謝大家!

參考文章
白話經(jīng)典算法系列之六 快速排序 快速搞定

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丰歌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拯欧,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡兼呵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門爆侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萍程,“玉大人,你說我怎么就攤上這事兔仰∶8海” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵乎赴,是天一觀的道長忍法。 經(jīng)常有香客問我,道長榕吼,這世上最難降的妖魔是什么饿序? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮羹蚣,結(jié)果婚禮上原探,老公的妹妹穿的比我還像新娘。我一直安慰自己顽素,他們只是感情好咽弦,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胁出,像睡著了一般型型。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上全蝶,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天闹蒜,我揣著相機與錄音,去河邊找鬼抑淫。 笑死绷落,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的始苇。 我是一名探鬼主播嘱函,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼埂蕊!你這毒婦竟也來了往弓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蓄氧,失蹤者是張志新(化名)和其女友劉穎函似,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉童,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡撇寞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堂氯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔑担。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咽白,靈堂內(nèi)的尸體忽然破棺而出啤握,到底是詐尸還是另有隱情,我是刑警寧澤晶框,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布排抬,位于F島的核電站,受9級特大地震影響授段,放射性物質(zhì)發(fā)生泄漏蹲蒲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一侵贵、第九天 我趴在偏房一處隱蔽的房頂上張望届搁。 院中可真熱鬧,春花似錦窍育、人聲如沸卡睦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽么翰。三九已至,卻和暖如春辽旋,著一層夾襖步出監(jiān)牢的瞬間浩嫌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工补胚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留码耐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓溶其,卻偏偏與公主長得像骚腥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瓶逃,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,325評論 0 2
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數(shù)組中束铭,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,323評論 1 42
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,028評論 0 2
  • 188期學(xué)員 姓名:孫燕茹 公司:北京旺順閣餐飲管理有限公司 【日精進打卡第5天】 【知~學(xué)習】 《六...
    阿茹姐閱讀 320評論 0 1