一些常用排序算法的Java實現(xiàn)之快速排序

基本思想

通過一輪的排序?qū)⑿蛄蟹指畛瑟毩⒌膬刹糠痔笨穑渲幸徊糠中蛄械年P(guān)鍵字(這里主要用值來表示)均比另一部分關(guān)鍵字小矩桂。繼續(xù)對長度較短的序列進行同樣的分割软族,最后到達整體有序添谊。在排序過程中财喳,由于已經(jīng)分開的兩部分的元素不需要進行比較,故減少了比較次數(shù)斩狱,降低了排序時間耳高。

一次劃分基本步驟

  1. 一個基準(zhǔn)值(通常是第一個數(shù)),兩個指針(前指針i所踊,后指針j)泌枪,起始時前指針指向第一個數(shù),后指針指向最后一個數(shù)秕岛。
  2. 后指針從后往前掃描碌燕,遇到比基準(zhǔn)值小的數(shù)a[j],a[i]與a[j]交換继薛,前指針i+1(為下一步從前往后掃描做準(zhǔn)備)
  3. 前指針從前往后掃描修壕,遇到比基準(zhǔn)值大的數(shù)a[i],a[j]與a[i]交換遏考,后指針j+1(為下一步從后往前掃描做準(zhǔn)備)
  4. 重復(fù)步驟二慈鸠,直到 i == j,則 a[i] = a[j] = 基準(zhǔn)值灌具,且基準(zhǔn)值左邊的數(shù)都比基準(zhǔn)值小青团,基準(zhǔn)值右邊的數(shù)都比基準(zhǔn)值大

算法實現(xiàn)

public int[] sort(int[] a, int left, int right){
        if (left < right){//遞歸出口譬巫,left=right說明一組只有一個元素
            int i = left;
            int j = right;
            int temp = a[left];
            while (i < j){//一次劃分,i=j說明指針相遇督笆,指針?biāo)冈刈筮吘萢[i]小芦昔,右邊均比a[i]大
                while (i < j && a[j] >= temp) {j--;}//后指針向前掃描找到比基準(zhǔn)值小的元素
                if(i < j) { a[i++] = a[j];}//若i < j則說明找到,交換
                while (i < j && a[i] <= temp) {i++;}
                if(i < j) { a[j--] = a[i];}
            }
            a[i] = temp;
            sort(a, left, i - 1);
            sort(a, i + 1, right);
        }
        return a;
    }

時間復(fù)雜度

  1. 最好情況:O(nlogn)
  2. 最壞情況:每次劃分只比上一次少了一個元素娃肿,也就是每次劃分都只拿到了最大或最小的元素烟零,退化為冒泡排序,n*n
  3. 一般情況:O(nlogn)

證明:快速排序時間復(fù)雜度為O(n×log(n))的證明

算法改進

  • 基準(zhǔn)值的選擇方面咸作。
    1锨阿、選取隨機數(shù)作為樞軸。
    但是隨機數(shù)的生成本身是一種代價记罚,根本減少不了算法其余部分的平均運行時間墅诡。
    2、 使用左端桐智,右端和中心的中值做為樞軸元末早。
    經(jīng)驗得知,選取左端说庭,右端然磷,中心元素的中值會減少了快排大約 14%的比較。
    3刊驴、每次選取數(shù)據(jù)集中的中位數(shù)做樞軸姿搜。
    選取中位數(shù)的可以在 O(n)時間內(nèi)完成。(證明見《算法導(dǎo)論(第二版) 》) P111 第九章中位數(shù)
  • 快速排序在處理小規(guī)模數(shù)據(jù)時的表現(xiàn)不好捆憎。
    這個時候可以改用插入排序舅柜。
    當(dāng)數(shù)據(jù)規(guī)模小于一定程度時,改用插入排序躲惰。具體小到何種規(guī)模時致份,采用插入排序,這個理論上還不解础拨,一些文章中說是 5 到 25 之間氮块。SGI STL 中的快速排序采用的值是 10。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诡宗,一起剝皮案震驚了整個濱河市滔蝉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僚焦,老刑警劉巖锰提,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡立肘,警方通過查閱死者的電腦和手機边坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谅年,“玉大人茧痒,你說我怎么就攤上這事∪邗澹” “怎么了旺订?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長超燃。 經(jīng)常有香客問我区拳,道長,這世上最難降的妖魔是什么意乓? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任樱调,我火速辦了婚禮,結(jié)果婚禮上届良,老公的妹妹穿的比我還像新娘笆凌。我一直安慰自己,他們只是感情好士葫,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布乞而。 她就那樣靜靜地躺著,像睡著了一般慢显。 火紅的嫁衣襯著肌膚如雪爪模。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天鳍怨,我揣著相機與錄音呻右,去河邊找鬼跪妥。 笑死鞋喇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眉撵。 我是一名探鬼主播侦香,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纽疟!你這毒婦竟也來了罐韩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤污朽,失蹤者是張志新(化名)和其女友劉穎散吵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡矾睦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年晦款,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚冗。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡缓溅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赁温,到底是詐尸還是另有隱情坛怪,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布股囊,位于F島的核電站袜匿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稚疹。R本人自食惡果不足惜沉帮,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贫堰。 院中可真熱鬧穆壕,春花似錦、人聲如沸其屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偎行。三九已至川背,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛤袒,已是汗流浹背熄云。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妙真,地道東北人缴允。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像珍德,于是被迫代替她去往敵國和親练般。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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

  • 概述 排序有內(nèi)部排序和外部排序锈候,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序薄料,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,170評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序泵琳,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序摄职,而外部排序是因排序的數(shù)據(jù)很大誊役,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評論 0 15
  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序谷市。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序势木。外排序:指在排序...
    jiangliang閱讀 1,336評論 0 1
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序歌懒,而外部排序是因排序的數(shù)據(jù)很大啦桌,一次不能容納全部的...
    Luc_閱讀 2,259評論 0 35
  • 我不確定還有多少個明天验烧,乃至還有沒有明天板驳,但我希望今天就能見到你。 我們都是這樣碍拆, “撲通”一聲落地若治,“bia嘰”...
    歐雷格森閱讀 787評論 0 1