圖解排序算法(五)之快速排序——三數(shù)取中法

簡介

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個排序過程可以遞歸進(jìn)行,以此達(dá)到整個數(shù)據(jù)變成有序序列

步驟

1. 三位取中

在快排的過程中,每一次我們要取一個元素作為樞紐值澈吨,以這個數(shù)字來將序列劃分為兩部分。在此我們采用三數(shù)取中法寄摆,也就是取左端谅辣、中間、右端三個數(shù)婶恼,然后進(jìn)行排序桑阶,將中間數(shù)作為樞紐值。


三位取中熙尉、排序联逻、樞紐值交換

2. 根據(jù)樞紐值進(jìn)行分割


根據(jù)樞紐值進(jìn)行分割

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

package com.smart.algorithm.sort;

import java.util.Arrays;

/**
 * 快速排序
 * Created by fc.w on 2017/11/21.
 */
public class Quick {

    public static void main(String[] args) {
        int[] arr = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
        quickSort(arr, 0, arr.length - 1);
        System.out.println("排序結(jié)果:" + Arrays.toString(arr));
    }

    /**
     * 排序
     * @param arr 待排序數(shù)組
     * @param left 左指針
     * @param right 左指針
     */
    private static void quickSort(int[] arr, int left, int right) {
        if (left < right) {
            // 獲取樞紐值,并將其放在當(dāng)前待處理序列末尾
            dealPivot(arr, left, right);
            // 樞紐值被放在序列末尾
            int pivot = arr[right - 1];
            // 左指針
            int i = left;
            // 右指針
            int j = right - 1;
            while (true) {
                while (arr[++i] < arr[pivot]){}
                while (j > left && arr[--j] > arr[pivot]) {}
                if (i < j) {
                    swap(arr, i, j);
                } else {
                    break;
                }

            }

            if (i < right) {
                swap(arr, i, right - 1);
            }
            // 分治法
            quickSort(arr, left, i - 1);
            quickSort(arr, i + 1, right);
        }
    }

    /**
     * 處理樞紐值
     * @param arr
     * @param left
     * @param right
     */
    private static void dealPivot(int[] arr, int left, int right) {
        int mid = (left + right) / 2;
        if (arr[left] > arr[right]) {
            swap(arr, left, right);
        }
        if (arr[left] > arr[mid]) {
            swap(arr, left, mid);
        }
        if (arr[right] < arr[mid]) {
            swap(arr, right, mid);
        }
        // 樞紐值被放在序列末尾
        swap(arr, right - 1, mid);
    }

    /**
     * 數(shù)據(jù)交換
     * @param arr
     * @param l
     * @param r
     */
    private static void swap(int[] arr, int l, int r) {
        int tmp = arr[l];
        arr[l] = arr[r];
        arr[r] = tmp;
    }

}

排序結(jié)果

排序結(jié)果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

總結(jié)

快速排序是一種交換類的排序检痰,它同樣是分治法的經(jīng)典體現(xiàn)包归。在一趟排序中將待排序的序列分割成兩組,其中一部分記錄的關(guān)鍵字均小于另一部分铅歼。然后分別對這兩組繼續(xù)進(jìn)行排序公壤,以使整個序列有序。在分割的過程中椎椰,樞紐值的選擇至關(guān)重要厦幅,本文采取了三位取中法,可以很大程度上避免分組"一邊倒"的情況慨飘∪泛快速排序平均時間復(fù)雜度也為O(nlogn)級译荞。

參考資料

[1]From 圖解排序算法(五)之快速排序——三數(shù)取中法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市休弃,隨后出現(xiàn)的幾起案子吞歼,更是在濱河造成了極大的恐慌,老刑警劉巖塔猾,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙骡,死亡現(xiàn)場離奇詭異,居然都是意外死亡丈甸,警方通過查閱死者的電腦和手機(jī)糯俗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睦擂,“玉大人得湘,你說我怎么就攤上這事《俪穑” “怎么了忽刽?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺欲。 經(jīng)常有香客問我,道長今膊,這世上最難降的妖魔是什么些阅? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮斑唬,結(jié)果婚禮上市埋,老公的妹妹穿的比我還像新娘。我一直安慰自己恕刘,他們只是感情好缤谎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褐着,像睡著了一般坷澡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上含蓉,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天频敛,我揣著相機(jī)與錄音,去河邊找鬼馅扣。 笑死斟赚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的差油。 我是一名探鬼主播拗军,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了发侵?” 一聲冷哼從身側(cè)響起交掏,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎器紧,沒想到半個月后耀销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铲汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年熊尉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掌腰。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰住,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出齿梁,到底是詐尸還是另有隱情催植,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布勺择,位于F島的核電站创南,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏省核。R本人自食惡果不足惜稿辙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望气忠。 院中可真熱鬧邻储,春花似錦、人聲如沸旧噪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淘钟。三九已至宦赠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間日月,已是汗流浹背袱瓮。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爱咬,地道東北人尺借。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像精拟,于是被迫代替她去往敵國和親燎斩。 傳聞我的和親對象是個殘疾皇子虱歪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序栅表,而外部排序是因排序的數(shù)據(jù)很大笋鄙,一次不能容納全部...
    蟻前閱讀 5,164評論 0 52
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序怪瓶,而外部排序是因排序的數(shù)據(jù)很大萧落,一次不能容納全部的...
    Luc_閱讀 2,255評論 0 35
  • 本文的整理基于:http://blog.csdn.net/hguisu/article/details/77760...
    阿阿阿阿毛閱讀 660評論 0 1
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序洗贰,而外部排序是因排序的數(shù)據(jù)很大找岖,一次不能容納全部...
    閑云清煙閱讀 756評論 0 6
  • 秋風(fēng)蕭瑟,樹葉紛紛凋落敛滋,光禿禿的冬天又快來臨了许布。古人描寫秋天總愛說秋天很傷感。也難怪绎晃,當(dāng)一陣寒風(fēng)刮過蜜唾,好多...
    雪_a1f3閱讀 416評論 2 2