排序算法(六) 歸并排序

參考
Java排序算法(六):歸并排序
數(shù)據(jù)結(jié)構(gòu)和算法(Golang實(shí)現(xiàn))(23)排序算法-歸并排序

假設(shè)初始序列含有n個(gè)元素蹋笼,我們可以把它看成是n個(gè)有序的子序列,每個(gè)子序列的長(zhǎng)度為1,然后兩兩合并绒北,得到n/2個(gè)長(zhǎng)度為2的有序子序列替蔬,再兩兩歸并... 如此重復(fù)艺晴,直至得到一個(gè)長(zhǎng)度為n的有序序列位置导坟,這種排序方法稱為2路歸并排序溃论。
如:無序數(shù)組序列{50, 10, 90, 30, 70, 40, 80, 60, 20}

Paste_Image.png
public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {50, 10, 90, 30, 70, 40, 80, 60, 20};
        System.out.println("排序之前:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        // 歸并排序
        mergeSort(arr);

        System.out.println();
        System.out.println("排序之后:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    /**
     * 歸并排序
     */
    public static void mergeSort(int[] arr) {
        int[] tmpArr = new int[arr.length];
        mergeSort(arr, tmpArr, 0, arr.length - 1);
    } 

    private static void mergeSort(int[] arr, int[] tmpArr, int low, int high) {
        if (low < high) {
            // 將數(shù)組arr分為arr[0..mid]和arr[mid+1..high]
            int middle = (low + high) / 2;  
            
            // 遞歸將arr[low..mid]歸并為有序的tmpArr[low..mid]
            mergeSort(arr, tmpArr, low, middle); 
            
            // 遞歸將arr[mid+1..high]歸并為有序的tmpArr[mid+1..high]
            mergeSort(arr, tmpArr, middle + 1, high); 
            
            // 將arr[low..mid]和arr[mid+1..high]歸并到tmpArr[low..high]
            merge(arr, tmpArr, low, middle + 1, high); 
        }
    }

    // 將有序的arr[low..mid]和arr[mid+1..high]歸并為有序的tmpArr[low..high]
    private static void merge(int[] arr, int[] tmpArr, int lowPos, int highPos, int highEnd) {
        int lowEnd = highPos - 1; 
        int tmpPos = lowPos;
        int numElements = highEnd - lowPos + 1; 

        // 將arr中的記錄由小到大歸并入tmpArr
        while (lowPos <= lowEnd && highPos <= highEnd){
            if (arr[lowPos] <= arr[highPos]){
                tmpArr[tmpPos++] = arr[lowPos++];
            }else{
                tmpArr[tmpPos++] = arr[highPos++];
            }
        }
        
        // 將剩余的arr[low..mid]復(fù)制到tmpArr
        while (lowPos <= lowEnd){
            tmpArr[tmpPos++] = arr[lowPos++]; 
        }
        
        // 將剩余的arr[mid+1..high]復(fù)制到tmpArr
        while (highPos <= highEnd){
            tmpArr[tmpPos++] = arr[highPos++]; 
        }

        // Copy tmpArr back
        for (int i = 0; i < numElements; i++, highEnd--){
            arr[highEnd] = tmpArr[highEnd];
        }
    }

}

時(shí)間復(fù)雜度:O(nlogn)
次算法是經(jīng)典的分治策略滔金,它將問題分成一些小的問題然后遞歸求解色解,而治的階段則將分的階段解得的各答案修補(bǔ)在一起,分而治之是遞歸非常有效的用法鹦蠕。
歸并排序是唯一一個(gè)有穩(wěn)定性保證的高級(jí)排序算法冒签,某些時(shí)候,為了尋求大規(guī)模數(shù)據(jù)下排序前后钟病,相同元素位置不變萧恕,可以使用歸并排序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肠阱,一起剝皮案震驚了整個(gè)濱河市票唆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屹徘,老刑警劉巖走趋,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異噪伊,居然都是意外死亡簿煌,警方通過查閱死者的電腦和手機(jī)氮唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姨伟,“玉大人惩琉,你說我怎么就攤上這事《峄模” “怎么了瞒渠?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)技扼。 經(jīng)常有香客問我伍玖,道長(zhǎng),這世上最難降的妖魔是什么剿吻? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任窍箍,我火速辦了婚禮,結(jié)果婚禮上和橙,老公的妹妹穿的比我還像新娘仔燕。我一直安慰自己,他們只是感情好魔招,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布晰搀。 她就那樣靜靜地躺著,像睡著了一般办斑。 火紅的嫁衣襯著肌膚如雪外恕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天乡翅,我揣著相機(jī)與錄音鳞疲,去河邊找鬼。 笑死蠕蚜,一個(gè)胖子當(dāng)著我的面吹牛尚洽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靶累,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼腺毫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了挣柬?” 一聲冷哼從身側(cè)響起潮酒,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邪蛔,沒想到半個(gè)月后急黎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年勃教,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淤击。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡故源,死狀恐怖遭贸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情心软,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布著蛙,位于F島的核電站删铃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踏堡。R本人自食惡果不足惜猎唁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顷蟆。 院中可真熱鬧诫隅,春花似錦、人聲如沸帐偎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)削樊。三九已至豁生,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漫贞,已是汗流浹背甸箱。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅脐,地道東北人芍殖。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谴蔑,于是被迫代替她去往敵國(guó)和親豌骏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,239評(píng)論 0 2
  • 概述 排序有內(nèi)部排序和外部排序树碱,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序肯适,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,164評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序成榜,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序框舔,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評(píng)論 0 15
  • 邀請(qǐng)所有家人的天使指導(dǎo)靈高級(jí)智慧們一起加持高能量道場(chǎng)! 今天繼續(xù)分享狂野想象的第二個(gè)工具刘绣,白日做夢(mèng)樱溉!白日做夢(mèng)你能得...
    嬌艷玲瓏閱讀 344評(píng)論 0 0
  • 心酸這個(gè)感覺其實(shí)是很微妙的。 我一直覺得心酸的感覺是比悲傷少一點(diǎn)纬凤,又比難過多一點(diǎn)福贞。總是有一種無力感停士,不知道如何做才...
    浩瀚宇宙愿你我相伴閱讀 306評(píng)論 0 0