三種快排優(yōu)化Java實(shí)現(xiàn)

快排優(yōu)化的三種思路:
  1. 選擇的軸樞元素娘赴,是否可以挑選的更好一些?

  2. 遞歸調(diào)用排序的時(shí)候挎挖,是否可以少一些調(diào)用这敬?

  3. partion操作是否可以優(yōu)化一些?

一蕉朵、基準(zhǔn)值選取優(yōu)化

如果基準(zhǔn)值選取的不合理崔涂,可能會(huì)導(dǎo)致快排的時(shí)間復(fù)雜度達(dá)到O(n2) 這個(gè)量級(jí),只有當(dāng)基準(zhǔn)值的選擇剛好將數(shù)據(jù)進(jìn)行平分的時(shí)候始衅,時(shí)間復(fù)雜度才是O(nlogn)冷蚂。

因?yàn)槲覀兒茈y在一個(gè)無(wú)序的數(shù)組中缭保,使用O(1)的時(shí)間復(fù)雜度找到可以把數(shù)組均分的基準(zhǔn)值,那么有沒(méi)有什么方法可以大概率找到這個(gè)值呢蝙茶?

這個(gè)方法就是三點(diǎn)取中法

即在一個(gè)數(shù)組中艺骂,取數(shù)組的第一個(gè)元素,中間一個(gè)元素隆夯,最后一個(gè)元素钳恕,然后排序后,將中間值作為基準(zhǔn)元素蹄衷,然后對(duì)數(shù)組進(jìn)行partiton操作忧额。

如下圖所示: 取5,2愧口,8然后排序后: 2睦番,5,8耍属,以5作為基準(zhǔn)元素然后進(jìn)行數(shù)據(jù)partion操作托嚣。

三點(diǎn)取中法

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

說(shuō)明: 查看之前快排的代碼中partition部分int pivot = nums[left]; 是將nums[left]作為了基準(zhǔn)值,所以要將計(jì)算得出的中間值厚骗,賦值給基準(zhǔn)值

 // 1. 基準(zhǔn)值選擇優(yōu)化
    public static void baseValueChooseOptimize(int[] nums, int left, int right){
        int pivot;
        if(left < right) {
            pivot = baseValueChoosePartition(nums, left, right);
            baseValueChooseOptimize(nums, left, pivot-1);
            baseValueChooseOptimize(nums, pivot+1, right);
        }

    }

    public static  int baseValueChoosePartition(int[] nums, int left, int right) {
        //計(jì)算并獲得3個(gè)數(shù)中示启,軸樞元素的坐標(biāo)
//      獲取中間元素的下標(biāo)
        int m = left + (right - left)/2;
        if(nums[left] > nums[right]) {   //保證左邊較小
            swap(nums, left, right);
        }

        if(nums[m] > nums[right]) {
            swap(nums, m, right);      //保證中間較小
        }

        if(nums[m] > nums[left]) {    //保證左端是中間值
            swap(nums, left, m);
        }

        //      為啥這里要用的是nums[left]呢?
        //      因?yàn)榭炫砰_(kāi)始執(zhí)行的時(shí)候是將第一個(gè)元素作為軸樞元素開(kāi)始分割的领舰,需要將三個(gè)元素中丑搔,中間的那個(gè)放到left的位置上。
        int pivot = nums[left];

        System.out.println("基準(zhǔn)值為:" + pivot);

        while(left < right) {

            while (left < right && nums[right] >= pivot) {
                right--;
            }

            nums[left] = nums[right];

            while (left < right && nums[left] <= pivot) {
                left++;
            }

            nums[right] = nums[left];


        }
        nums[left] = pivot;
        return left;

    }
二提揍、單邊遞歸優(yōu)化

看下圖代碼,每次完成一次partition操作后煮仇,就會(huì)對(duì)基準(zhǔn)值左右兩側(cè)進(jìn)行了遞歸調(diào)用劳跃,從程序運(yùn)行的過(guò)程來(lái)看,每遞歸調(diào)用一次方法浙垫,都會(huì)有耗時(shí)刨仑。

快排遞歸調(diào)用

則考慮減少函數(shù)調(diào)用的方式,來(lái)縮短程序運(yùn)行時(shí)間夹姥。

解決方法: 在每次完成partition操作后杉武,直接在本層直接完成基準(zhǔn)值左邊的partition操作(需要一個(gè)循環(huán)),而基準(zhǔn)值右邊的操作辙售,放到下一輪partition操作來(lái)完成轻抱。

代碼示例:

    // 2、單邊遞歸優(yōu)化
    public void singleRecursionOptimize(int[] nums, int left, int right) {
        int middle = 0;
        while(left < right) {
            middle = partition(nums, left, right);
//          對(duì)分界值分隔的兩個(gè)數(shù)組;
//          middle左邊的數(shù)組在一個(gè)循環(huán)里旦部,繼續(xù)執(zhí)行partion操作
//          middle右邊的數(shù)組在下一次遞歸中再進(jìn)行調(diào)用祈搜。
            quickSort(nums, middle+1, right);
            right = middle -1;
        }

    }
三较店、partition操作優(yōu)化

暫時(shí)沒(méi)太理解,待后續(xù)補(bǔ)充...

詳細(xì)代碼見(jiàn):algorithm_java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末容燕,一起剝皮案震驚了整個(gè)濱河市梁呈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蘸秘,老刑警劉巖官卡,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異醋虏,居然都是意外死亡寻咒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門灰粮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仔涩,“玉大人,你說(shuō)我怎么就攤上這事粘舟∪壑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵柑肴,是天一觀的道長(zhǎng)霞揉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晰骑,這世上最難降的妖魔是什么适秩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮硕舆,結(jié)果婚禮上秽荞,老公的妹妹穿的比我還像新娘。我一直安慰自己抚官,他們只是感情好扬跋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著凌节,像睡著了一般钦听。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倍奢,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天朴上,我揣著相機(jī)與錄音,去河邊找鬼卒煞。 笑死痪宰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酵镜,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碉碉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了淮韭?” 一聲冷哼從身側(cè)響起垢粮,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎靠粪,沒(méi)想到半個(gè)月后蜡吧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡占键,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年昔善,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畔乙。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡君仆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牲距,到底是詐尸還是另有隱情返咱,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布牍鞠,位于F島的核電站咖摹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏难述。R本人自食惡果不足惜萤晴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胁后。 院中可真熱鬧店读,春花似錦、人聲如沸攀芯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敲才。三九已至,卻和暖如春择葡,著一層夾襖步出監(jiān)牢的瞬間紧武,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工敏储, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阻星,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妥箕,于是被迫代替她去往敵國(guó)和親滥酥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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