內(nèi)排序7:二路歸并排序

歸并是指將兩個(gè)或多個(gè)按值有序序列合并成為一個(gè)按值有序序列的過程蜂科。
二路歸并是將兩個(gè)按值有序序列合并成為一個(gè)按值有序序列顽决。
同理,有 三路歸并导匣,思路歸并等才菠。

歸并子算法:
功能是把位置相鄰的兩個(gè)按值有序的序列合并為一個(gè)按值有序的序列
具體實(shí)現(xiàn)如下:

var merge = function(X, Z, s, u, v) {
    //將有序的x[s..u]和x[u+1..v]歸并為有序的x[s..v]
    let i, j, q
    i = s
    j = u + 1
    q = s

    while (i <= u && j <= v) {
        if (X[i] < X[j]) {
            Z[q++] = X[i++]
        } else {
            Z[q++] = X[j++]
        }
    }

    while (i <= u) {
        Z[q++] = X[i++]
    }
    while (j <= v) {
        Z[q++] = X[j++]
    }
}

一趟歸并掃描子算法:
功能是將參加排序的序列分成若干長(zhǎng)度為t的,且各自按值有序的子序列贡定,然后多次調(diào)用歸并子算法Merge將所有兩兩相鄰成對(duì)的子序列合并成若干個(gè)長(zhǎng)度為2t的赋访、且各自按值有序的子序列。
具體實(shí)現(xiàn)如下:

var mpass = function(X, Y, n, t) {
    let i = 0;
    while (n - i + 1 > 2 * t) {
        merge(X, Y, i, i + t - 1, i + 2 * t - 1)
        i = i + 2 * t
    }
    if (n - i + 1 > t) {
        merge(X, Y, i, i + t - 1, n - 1)
    } else {
        for (let j = i; j < n; j++) {
            Y[j] = X[j]
        }
    }
}

二路歸并排序:
就是最初將長(zhǎng)度為n的原始序列理解為由n個(gè)長(zhǎng)度為1的按值有序的子序列組成缓待,并把這些子序列中相鄰的子序列兩兩成對(duì)地進(jìn)行合并蚓耽,得到[n/2]個(gè)長(zhǎng)度為2的按值有序子序列(若n為奇數(shù),則還有第[n/2]個(gè)子序列旋炒,它是原序列中最后那個(gè)子序列)步悠;然后將這些子序列又兩兩成對(duì)地進(jìn)行合并,得到[n/4]個(gè)長(zhǎng)度為4的按值有序子序列瘫镇;依次類推鼎兽,最后只剩一個(gè)長(zhǎng)度為n的子序列,這個(gè)子序列就是原始序列經(jīng)過二路歸并排序后的結(jié)果铣除。
具體實(shí)現(xiàn)如下:

var mergeSort = function(X) {
    let t = 1
    let n = X.length
    let Y = []
    let isx = false
    while (t < n) {
        mpass(X, Y, n, t)
        isx = false
        t *= 2
        if (t <= n) {
            mpass(Y, X, n, t)
            isx = true
        }
        t *= 2
    }
    return isx? X:Y
}
var arr = [5, 3, 8, 1, 9, 2, 7, 4, 6, 10]
console.log(mergeSort(arr))

時(shí)間復(fù)雜度為O(nlog2n)
空間復(fù)雜度為O(n)
是穩(wěn)定排序

第二種方法:

function mergeSort(arr) {  // 采用自上而下的遞歸方法
    var len = arr.length;
    if(len < 2) {
        return arr;
    }
    var middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right)
{
    var result = [];

    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }

    while (left.length)
        result.push(left.shift());

    while (right.length)
        result.push(right.shift());

    return result;
}
var arr = [5,3,8,1,9,2,7,4,6,10]
mergeSort(arr)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谚咬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尚粘,更是在濱河造成了極大的恐慌择卦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郎嫁,死亡現(xiàn)場(chǎng)離奇詭異秉继,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泽铛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門秕噪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厚宰,你說我怎么就攤上這事∷焯睿” “怎么了铲觉?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吓坚。 經(jīng)常有香客問我撵幽,道長(zhǎng),這世上最難降的妖魔是什么礁击? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任盐杂,我火速辦了婚禮逗载,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘链烈。我一直安慰自己厉斟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布强衡。 她就那樣靜靜地躺著擦秽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漩勤。 梳的紋絲不亂的頭發(fā)上感挥,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音越败,去河邊找鬼触幼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛究飞,可吹牛的內(nèi)容都是我干的置谦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼噪猾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼霉祸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袱蜡,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤丝蹭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坪蚁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奔穿,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年敏晤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贱田。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘴脾,死狀恐怖男摧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情译打,我是刑警寧澤耗拓,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奏司,受9級(jí)特大地震影響乔询,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韵洋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一竿刁、第九天 我趴在偏房一處隱蔽的房頂上張望黄锤。 院中可真熱鬧,春花似錦食拜、人聲如沸鸵熟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旅赢。三九已至,卻和暖如春惑惶,著一層夾襖步出監(jiān)牢的瞬間煮盼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工带污, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僵控,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓鱼冀,卻偏偏與公主長(zhǎng)得像报破,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子千绪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 基本思想:把一個(gè)長(zhǎng)度為n 的無序序列看成是 n 個(gè)長(zhǎng)度為 1 的有序子序列 充易,首先做兩兩歸并,得到 [n / 2]...
    Mad_Elliot閱讀 1,350評(píng)論 0 0
  • 二路歸并排序: 分治法思想 (穩(wěn)定)思想: 將兩個(gè)或者兩個(gè)以上的有序表合并成為一個(gè)有序表.假定待排序表中有n個(gè)記錄...
    FConfidence閱讀 402評(píng)論 0 0
  • 1荸型、歸并排序的基本思想 歸并排序主要是二路歸并排序盹靴。二路歸并排序的基本思想,設(shè)數(shù)組a中存放了n個(gè)數(shù)據(jù)元素瑞妇,初始時(shí)把...
    風(fēng)緊扯呼閱讀 547評(píng)論 0 0
  • 1. 歸并排序思想 歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法稿静,該算法是采用分治法(D...
    槿沐I閱讀 338評(píng)論 0 0
  • 合并排序也叫歸并排序,它的主要思想是分治法辕狰,把待排序序列分為若干有序子序列改备,然后將兩個(gè)或兩個(gè)以上的有序子序列進(jìn)行...
    ITsCLG閱讀 1,059評(píng)論 0 2