八大排序算法(1)-歸并排序

1.歸并排序的基本思想

將待排序序列R[0...n-1]看成是n個長度為1的有序序列瓶蝴,將相鄰的有序表成對歸并,得到n/2個長度為2的有序表租幕;將這些有序序列再次歸并舷手,得到n/4個長度為4的有序序列;如此反復(fù)進行下去劲绪,最后得到一個長度為n的有序序列男窟。

綜上可知:

歸并排序其實要做兩件事:

(1)“分解”——將序列每次折半劃分盆赤。

(2)“合并”——將劃分后的序列段兩兩合并后排序。

我們先來考慮第二步歉眷,如何合并牺六?

在每次合并過程中,都是對兩個有序的序列段進行合并汗捡,然后排序淑际。

這兩個有序序列段分別為 R[low, mid] 和 R[mid+1, high]。

先將他們合并到一個局部的暫存數(shù)組R2中扇住,帶合并完成后再將R2復(fù)制回R中春缕。

為了方便描述,我們稱 R[low, mid] 第一段艘蹋,R[mid+1, high] 為第二段锄贼。

每次從兩個段中取出一個記錄進行關(guān)鍵字的比較,將較小者放入R2中女阀。最后將各段中余下的部分直接復(fù)制到R2中宅荤。

經(jīng)過這樣的過程,R2已經(jīng)是一個有序的序列浸策,再將其復(fù)制回R中膘侮,一次合并排序就完成了。

package com.ustc.algorithm;

import java.util.Arrays;

/** 
* @author 王聰
* @version 創(chuàng)建時間:2017年2月24日 下午7:57:17 
* 類說明 
*/
public class MergeSort {
    /**
     * 歸并排序
     * 簡介:將兩個(或兩個以上)有序表合并成一個新的有序表 即把待排序序列分為若干個子序列的榛,每個子序列是有序的琼了。然后再把有序子序列合并為整體有序序列
     * 時間復(fù)雜度為O(nlogn)
     * 穩(wěn)定排序方式
     * @param nums 待排序數(shù)組
     * @return 輸出有序數(shù)組
     */
    public static int[] sort(int[] nums, int low, int high) {
        int mid = (low + high) / 2;
        while (low < high) {
            // 左邊
            sort(nums, low, mid);
            // 右邊
            sort(nums, mid + 1, high);
            // 左右歸并
            merge(nums, low, mid, high);
        }
        return nums;
    }

    public static void merge(int[] nums, int low, int mid, int high) {
        int[] temp = new int[high - low + 1];
        int i = low;// 左指針
        int j = mid + 1;// 右指針
        int k = 0;

        // 把較小的數(shù)先移到新數(shù)組中
        while (i <= mid && j <= high) {
            if (nums[i] < nums[j]) {
                temp[k++] = nums[i++];
            } else {
                temp[k++] = nums[j++];
            }
        }

        // 把左邊剩余的數(shù)移入數(shù)組
        while (i <= mid) {
            temp[k++] = nums[i++];
        }

        // 把右邊邊剩余的數(shù)移入數(shù)組
        while (j <= high) {
            temp[k++] = nums[j++];
        }

        // 把新數(shù)組中的數(shù)覆蓋nums數(shù)組
        for (int k2 = 0; k2 < temp.length; k2++) {
            nums[k2 + low] = temp[k2];
        }
    }

    
    // 歸并排序的實現(xiàn)
    public static void main(String[] args) {

        int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };

        MergeSort.sort(nums, 0, nums.length-1);
        System.out.println(Arrays.toString(nums));
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夫晌,隨后出現(xiàn)的幾起案子雕薪,更是在濱河造成了極大的恐慌,老刑警劉巖晓淀,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件所袁,死亡現(xiàn)場離奇詭異,居然都是意外死亡凶掰,警方通過查閱死者的電腦和手機燥爷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懦窘,“玉大人前翎,你說我怎么就攤上這事〕┩浚” “怎么了港华?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長午衰。 經(jīng)常有香客問我立宜,道長冒萄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任橙数,我火速辦了婚禮尊流,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灯帮。我一直安慰自己奠旺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布施流。 她就那樣靜靜地躺著响疚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞪醋。 梳的紋絲不亂的頭發(fā)上忿晕,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音银受,去河邊找鬼践盼。 笑死,一個胖子當(dāng)著我的面吹牛宾巍,可吹牛的內(nèi)容都是我干的咕幻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼顶霞,長吁一口氣:“原來是場噩夢啊……” “哼肄程!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起选浑,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蓝厌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后古徒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拓提,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年隧膘,在試婚紗的時候發(fā)現(xiàn)自己被綠了代态。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡疹吃,死狀恐怖蹦疑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情互墓,我是刑警寧澤必尼,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布蒋搜,位于F島的核電站篡撵,受9級特大地震影響判莉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜育谬,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一券盅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膛檀,春花似錦锰镀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嚎杨,卻和暖如春花鹅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枫浙。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工刨肃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箩帚。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓真友,卻偏偏與公主長得像,于是被迫代替她去往敵國和親紧帕。 傳聞我的和親對象是個殘疾皇子盔然,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序是嗜,而外部排序是因排序的數(shù)據(jù)很大轻纪,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序叠纷,而外部排序是因排序的數(shù)據(jù)很大刻帚,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,253評論 0 2
  • Ba la la la ~ 讀者朋友們,你們好啊涩嚣,又到了冷鋒時間崇众,話不多說,發(fā)車航厚! 1.冒泡排序(Bub...
    王飽飽閱讀 1,794評論 0 7
  • 我隨意地走在東大的路上 左顧右盼 看四周來來往往的人 心情平靜如止水 忽然 目光下看 我看到了滿地的落葉 遍地金黃...
    最愛吃冰閱讀 275評論 0 2