歸并排序

概要

歸并排序就是將一個數(shù)組分成前后兩部分征唬,分別排序礁扮,最后將結(jié)果歸并起來忿偷,形成一個有序的新數(shù)組蛉威。

  • 優(yōu)點:數(shù)組排序所需時間與數(shù)組長度關(guān)系:NlogN
  • 缺點:需要的額外空間與N成正比材蛛。原因:排好序的元素放到了新數(shù)組圆到,就占用了額外的空間。

因此卑吭,如果歸并一個很大的數(shù)組芽淡,進行多次歸并時,由于每次歸并都會創(chuàng)建一個新數(shù)組豆赏,那所占用的空間會很大挣菲,也會有好多麻煩。

原地歸并

如果能在原地歸并掷邦,不需要額外的空間的話白胀,那就能解決上述問題。

  • java代碼:(將一個前后兩部分分別有序的數(shù)組原地歸并)
public static void merge(Comparable[] a, int lo, int mid, int hi)
{//將a[lo, mid]和a[mid + 1, hi]歸并
    int i = lo, j = mid+1;

    for (int k = lo; k <= hi; k++)//首先將a[lo...hi]復制到aux[lo...hi]
        aux[k] = a[k];
    
    for (int k = lo; k <=hi; k++)//歸并回到a[lo...hi]
        if (i > mid) a[k] = aux[j++];  //左半邊取盡就取右半邊的元素
        else if (i > mid) a[k] = aux[j++];  //右半邊取盡就取左半邊的元素
        else if less(aux[j], aux[i])) a[k] = aux[j++];//兩邊都沒有取盡就比較儡率,把較小的取出來
        else a[k] = aux[i++];
}

自頂向下的歸并排序

對子數(shù)組a[l0...hi]排序良蛮,將它分為a[l0...mid]和a[mid+1...hi]兩部分钉跷,分別地鬼調(diào)用他們單獨排序,最后將有序的兩個子數(shù)組歸并為最終的排序結(jié)果向抢。

  • java代碼
public class Merge
{
    private static Comparable[] aux;  //歸并所需的輔助數(shù)組
    
    public static void sort(Comparable[] a)
    {
        aux = new Comaparable[a.length];//一次性分配空間
        sort(a, 0, a.length - 1);
    }

    private static void sort(Comparable[] a, int lo, int hi)
    {
        if (hi <= lo) return;
        int mid = lo + (hi - lo)/2;
        sort(a, lo, mid); //將左邊排序
        sort(a, mid+1, hi);//將右邊排序
        merge(a, lo, mid, hi);//歸并結(jié)果
    }
}
  • 代碼研究
    歸并排序的代碼核心其實就是sort(Comparable[] a, int lo, int hi)函數(shù)不斷的自我調(diào)用。
  • 以a[0...15]為例
    sort()方法調(diào)用自己將左半部分a[0...7]排序胚委,再在其中調(diào)用自己將左半部分a[0...3]排序挟鸠,再調(diào)用自己將a[0...3]左半部分a[0...1]排序。然后將a[0...3]右半部分a[2...3]排序亩冬,最后a[0...3]左右部分合并兄猩。。。枢冤。軌跡圖如圖一所示:


    圖一:自頂向下的歸并排序的調(diào)用軌跡

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸠姨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淹真,更是在濱河造成了極大的恐慌讶迁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件核蘸,死亡現(xiàn)場離奇詭異巍糯,居然都是意外死亡,警方通過查閱死者的電腦和手機客扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門祟峦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徙鱼,你說我怎么就攤上這事宅楞。” “怎么了袱吆?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵厌衙,是天一觀的道長。 經(jīng)常有香客問我绞绒,道長婶希,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任蓬衡,我火速辦了婚禮喻杈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狰晚。我一直安慰自己奕塑,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布家肯。 她就那樣靜靜地躺著龄砰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讨衣。 梳的紋絲不亂的頭發(fā)上换棚,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音反镇,去河邊找鬼固蚤。 笑死,一個胖子當著我的面吹牛歹茶,可吹牛的內(nèi)容都是我干的夕玩。 我是一名探鬼主播你弦,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼燎孟!你這毒婦竟也來了禽作?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤揩页,失蹤者是張志新(化名)和其女友劉穎旷偿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爆侣,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡萍程,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔仰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茫负。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乎赴,靈堂內(nèi)的尸體忽然破棺而出忍法,到底是詐尸還是另有隱情,我是刑警寧澤无虚,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布缔赠,位于F島的核電站衍锚,受9級特大地震影響友题,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戴质,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一度宦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧告匠,春花似錦戈抄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戚哎,卻和暖如春裸诽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背型凳。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工丈冬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甘畅。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓埂蕊,卻偏偏與公主長得像往弓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓄氧,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 數(shù)據(jù)結(jié)構(gòu)與算法--歸并排序 歸并排序 歸并排序基于一種稱為“歸并”的簡單操作函似。比如考試可能會分年級排名和班級排名,...
    sunhaiyu閱讀 873評論 0 6
  • Q:什么是歸并排序匀们?A:它是建立在歸并操作上的一種有效的排序算法缴淋;是采用分治法的一個非常典型的應(yīng)用;是一種穩(wěn)定的 ...
    TinyDolphin閱讀 2,931評論 5 4
  • 基本思路 將一個數(shù)組排序泄朴,可以先(遞歸地)將它分成兩半分別排序重抖,然后將結(jié)果歸并起來。 最基本的算法——歸并操作 歸...
    Xerrard閱讀 469評論 0 0
  • 1. 基本思想 ①Divide array into two halves.②Recursively sort e...
    不會code的程序猿閱讀 371評論 0 0
  • 思路 歸并排序的思想是先將數(shù)組分散為小數(shù)組分別排序祖灰,然后將結(jié)果歸并起來钟沛。 原地歸并的抽象方法 將兩個已經(jīng)排序好的數(shù)...
    不可思議的Mark閱讀 4,090評論 12 31