歸并排序

概述

如果一個數(shù)組有n個數(shù)據(jù)厢塘,則可以把這個數(shù)組看作n個有序的子序列,每個子序列的長度為1肌幽,然后兩兩歸并晚碾,就能得到[n/2]個長度為2或1的子序列,再不斷地兩兩歸并喂急,直到得到一個長度為n的有序數(shù)組格嘁。
這種排序方法稱為2路歸并排序

遞歸,java實現(xiàn)

public class MergeSort {
    public static void main(String[] args) {
        int[] array = {98, 21, 62, 48, 33, 6, 55, 17};
        System.out.print("MergeSort\n");
        printArray(array);
        System.out.print("start:\n");
        mergeSort(array, 0, array.length - 1);
        System.out.print("end:\n");
    }

    static void mergeSort(int[] arr, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            mergeSort(arr, low, mid);
            mergeSort(arr, mid + 1, high);
            merge(arr, low, mid, high);
        }
    }

    static void merge(int[] arr, int low, int mid, int high) {
        //temp數(shù)組用于暫存合并的結(jié)果
        int[] temp = new int[high - low + 1];
        //左半邊的指針
        int i = low;
        //右半邊的指針
        int j = mid+1;
        //合并后數(shù)組的指針
        int k = 0;

        //將記錄由小到大地放進temp數(shù)組
        for(; i <= mid && j <= high; k++)
        {
            if(arr[i] < arr[j])
                temp[k] = arr[i++];
            else
                temp[k] = arr[j++];
        }

        //接下來兩個while循環(huán)是為了將剩余的(比另一邊多出來的個數(shù))放到temp數(shù)組中
        while(i <= mid)
            temp[k++] = arr[i++];

        while(j <= high)
            temp[k++] = arr[j++];

        //將temp數(shù)組中的元素寫入到待排數(shù)組中
        for(int l = 0; l < temp.length; l++)
            arr[low + l] = temp[l];

        printArray(arr);

    }

    static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.print("\n");
    }
}

排序效果

MergeSort
98 21 62 48 33 6 55 17 
start:
21 98 62 48 33 6 55 17 
21 98 48 62 33 6 55 17 
21 48 62 98 33 6 55 17 
21 48 62 98 6 33 55 17 
21 48 62 98 6 33 17 55 
21 48 62 98 6 17 33 55 
6 17 21 33 48 55 62 98 
end:

復(fù)雜度

時間復(fù)雜度: O(nlogn)
空間復(fù)雜度: O(n+nlogn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末廊移,一起剝皮案震驚了整個濱河市糕簿,隨后出現(xiàn)的幾起案子探入,更是在濱河造成了極大的恐慌,老刑警劉巖懂诗,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜂嗽,死亡現(xiàn)場離奇詭異,居然都是意外死亡响禽,警方通過查閱死者的電腦和手機徒爹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芋类,“玉大人,你說我怎么就攤上這事界阁『罘保” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵泡躯,是天一觀的道長贮竟。 經(jīng)常有香客問我,道長较剃,這世上最難降的妖魔是什么咕别? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮写穴,結(jié)果婚禮上惰拱,老公的妹妹穿的比我還像新娘。我一直安慰自己啊送,他們只是感情好偿短,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馋没,像睡著了一般昔逗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上篷朵,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天勾怒,我揣著相機與錄音,去河邊找鬼声旺。 笑死笔链,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艾少。 我是一名探鬼主播卡乾,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缚够!你這毒婦竟也來了幔妨?” 一聲冷哼從身側(cè)響起鹦赎,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎误堡,沒想到半個月后古话,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锁施,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年陪踩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悉抵。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡肩狂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姥饰,到底是詐尸還是另有隱情傻谁,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布列粪,位于F島的核電站审磁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岂座。R本人自食惡果不足惜态蒂,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望费什。 院中可真熱鬧钾恢,春花似錦、人聲如沸吕喘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氯质。三九已至募舟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闻察,已是汗流浹背拱礁。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辕漂,地道東北人呢灶。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像钉嘹,于是被迫代替她去往敵國和親鸯乃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • 數(shù)據(jù)結(jié)構(gòu)與算法--歸并排序 歸并排序 歸并排序基于一種稱為“歸并”的簡單操作跋涣。比如考試可能會分年級排名和班級排名缨睡,...
    sunhaiyu閱讀 871評論 0 6
  • 歸并排序 所謂歸并鸟悴,就是將兩個或兩個以上的有序表合并成一個新的有序表。如下圖所示奖年,有兩個已經(jīng)排好序的有序表A[1]...
    JackChen1024閱讀 2,356評論 0 4
  • 一细诸、 單項選擇題(共71題) 對n個元素的序列進行冒泡排序時,最少的比較次數(shù)是( )陋守。A. n ...
    貝影閱讀 8,983評論 0 10
  • 昨天陰雨淅瀝水评,我和宋老師一起吃飯的時候隨便叨叨猩系,居然把本該傷感的餞別情緒渲染的有點不正經(jīng)。年后就回老家的宋老師還是...
    杜爾西閱讀 680評論 0 0