懵X排序算法:快速排序

原文地址:https://xeblog.cn/articles/17

快速排序基本思想

快速排序使用的是 分治思想润脸,通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分间螟,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小隅居,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行卵渴,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列李命。

image

實(shí)現(xiàn)思路

  • 設(shè)置一個(gè)基準(zhǔn)值 k ,一般取數(shù)組第一個(gè)元素蕉汪,以此值分割數(shù)組旺垒;
  • 設(shè)置兩個(gè)掃描員,分別為 ij肤无,i 指向數(shù)組的最低位j 指向數(shù)組的最高位骇钦;
  • 首先由 j 開始從數(shù)組最高位往數(shù)組最低位(j--)掃描比 k 小的值宛渐,掃描到后停止掃描,并將該值填入 i 所處的位置眯搭,然后再由 i 開始從數(shù)組最低位 往數(shù)組最高位(i++)掃描比 k 大的值窥翩,掃描到后停止掃描,并將該值填入 j 所處的位置鳞仙,ji 依次掃描寇蚊,直至 ji 的位置相互重合后,將 k 的值填入重合處棍好,此時(shí)仗岸,數(shù)組左側(cè)的值均小于 k允耿,右側(cè)值均大于 k,完成此次排序扒怖;
  • 分別對(duì)數(shù)組左右兩邊的值做如上操作后即可完成快速排序较锡。

演示圖

快速排序演示圖.gif

代碼實(shí)現(xiàn)

    /**
     * 快速排序
     * @param array 待排序數(shù)組
     * @param begin 起點(diǎn)索引
     * @param end 終點(diǎn)索引
     */
    private static void fastSort(int[] array, int begin, int end) {
        // 遞歸終止條件,起點(diǎn)索引大于等于終點(diǎn)索引
        if (begin >= end) {
            return;
        }

        // 起點(diǎn)索引
        int i = begin;
        // 終點(diǎn)索引
        int j = end;
        // 基準(zhǔn)值
        int k = array[begin];

        // 循環(huán)條件:起點(diǎn)索引小于終點(diǎn)索引
        while (i < j) {
            /*
            這個(gè)循環(huán)是要掃描小于基準(zhǔn)值的值盗痒,掃描到后退出循環(huán),
            循環(huán)條件:當(dāng)前索引位的值大于等于基準(zhǔn)值k(加等于號(hào)是防止相同數(shù)字交換而陷入死循環(huán)中),
            且起點(diǎn)索引小于終點(diǎn)索引(防止數(shù)組下標(biāo)出界)
             */
            while (array[j] >= k && i < j) {
                // 終點(diǎn)索引位從右至左逐個(gè)遞減
                j--;
            }

            if (i < j) {
                // 將小于基準(zhǔn)值的數(shù)移至左側(cè)
                array[i] = array[j];
            }

            /*
            這個(gè)循環(huán)是要掃描大于基準(zhǔn)值的值蚂蕴,掃描到后退出循環(huán),
            循環(huán)條件:當(dāng)前索引位的值小于等于基準(zhǔn)值k(加等于號(hào)是防止相同數(shù)字交換而陷入死循環(huán)中),
            且起點(diǎn)索引小于終點(diǎn)索引(防止數(shù)組下標(biāo)出界)
             */
            while (array[i] <= k && i < j) {
                // 起點(diǎn)索引位從左至右逐個(gè)遞增
                i++;
            }
            if (i < j) {
                // 將大于基準(zhǔn)值的數(shù)移至右側(cè)
                array[j] = array[i];
            }
        }
        if (array[j] != k) {
            // 基準(zhǔn)值歸位(數(shù)組的中間某個(gè)位置),歸位后俯邓,基準(zhǔn)值左側(cè)都是小于基準(zhǔn)值的數(shù)骡楼,右側(cè)都是大于基準(zhǔn)值的數(shù)
            array[j] = k;
        }
        // 遞歸將基準(zhǔn)值左側(cè)的數(shù)排序
        fastSort(array, begin, j - 1);
        // 遞歸將基準(zhǔn)值右側(cè)的數(shù)排序
        fastSort(array, j + 1, end);
    }

測(cè)試排序

int[] array = {5, 6, 6, 4, 3, 5, 5};
System.out.println("排序前:" + Arrays.toString(array));
fastSort(array, 0, array.length - 1);
System.out.println("排序后:" + Arrays.toString(array));

輸出結(jié)果

排序前:[5, 6, 6, 4, 3, 5, 5]
排序后:[3, 4, 5, 5, 5, 6, 6]

快速排序的時(shí)間復(fù)雜度

平均時(shí)間復(fù)雜度: O(nlogn)
最壞時(shí)間復(fù)雜度: O(n^2) 稽鞭,這種情況發(fā)生在排序數(shù)組為正序逆序的時(shí)候鸟整。
穩(wěn)定性: 不穩(wěn)定。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末川慌,一起剝皮案震驚了整個(gè)濱河市吃嘿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梦重,老刑警劉巖兑燥,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琴拧,居然都是意外死亡降瞳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蚓胸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挣饥,“玉大人,你說(shuō)我怎么就攤上這事沛膳∪臃悖” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵锹安,是天一觀的道長(zhǎng)短荐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)叹哭,這世上最難降的妖魔是什么忍宋? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮风罩,結(jié)果婚禮上糠排,老公的妹妹穿的比我還像新娘。我一直安慰自己超升,他們只是感情好入宦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布哺徊。 她就那樣靜靜地躺著,像睡著了一般云石。 火紅的嫁衣襯著肌膚如雪唉工。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天汹忠,我揣著相機(jī)與錄音淋硝,去河邊找鬼。 笑死宽菜,一個(gè)胖子當(dāng)著我的面吹牛谣膳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铅乡,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼继谚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了阵幸?” 一聲冷哼從身側(cè)響起花履,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挚赊,沒(méi)想到半個(gè)月后诡壁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荠割,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年妹卿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔑鹦。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夺克,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚎朽,到底是詐尸還是另有隱情铺纽,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布哟忍,位于F島的核電站室囊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏魁索。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一盼铁、第九天 我趴在偏房一處隱蔽的房頂上張望粗蔚。 院中可真熱鬧,春花似錦饶火、人聲如沸鹏控。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)当辐。三九已至抖僵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缘揪,已是汗流浹背耍群。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留找筝,地道東北人蹈垢。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袖裕,于是被迫代替她去往敵國(guó)和親曹抬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,352評(píng)論 0 2
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,262評(píng)論 0 2
  • 總結(jié)一下常見(jiàn)的排序算法急鳄。 排序分內(nèi)排序和外排序谤民。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,350評(píng)論 0 1
  • 排序算法說(shuō)明 (1)排序的定義:對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序疾宏; 輸入:n個(gè)數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 665評(píng)論 0 0
  • 參考:十大經(jīng)典排序算法 0张足、排序算法說(shuō)明 0.1排序的定義 對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序。 0.2 術(shù)語(yǔ)說(shuō)明...
    誰(shuí)在烽煙彼岸閱讀 1,015評(píng)論 0 12