JS實(shí)現(xiàn)歸并排序

遞歸的內(nèi)存堆棧分析

一直對(duì)遞歸理解不深,原因是遞歸的過(guò)程很抽象,分析不清內(nèi)存堆棧的返回過(guò)程吹埠。偶然google到一篇博文遞歸(不得不說(shuō),技術(shù)問(wèn)題還是要多google),對(duì)遞歸過(guò)程的內(nèi)存堆棧分析豁然開(kāi)朗缘琅,下面先列出分析過(guò)程:

// A C++ program to demonstrate working of recursion
#include<bits/stdc++.h>
using namespace std;
void printFun(int test)
{
    if (test < 1)
        return;
    else
    {
        cout << test << " ";
        printFun(test-1);    // statement 2
        cout << test << " ";
        return;
    }
}
int main()
{
    int test = 3;
    printFun(test);
}

下面這個(gè)圖準(zhǔn)確的列出了整個(gè)遞歸的過(guò)程粘都,以后遇到單次遞歸問(wèn)題,完全可以用此方法分析(對(duì)于多次遞歸情況刷袍,嘗試畫(huà)了一下歸并排序里的兩次遞歸翩隧,實(shí)在沒(méi)有辦法整潔的排版,作罷呻纹。堆生。)

言歸正傳,下面分析歸并排序居暖。

歸并排序

歸并排序采用的是分治的思想顽频,首先是“分”,將一個(gè)數(shù)組反復(fù)二分為兩個(gè)小數(shù)組太闺,直到每個(gè)數(shù)組只有一個(gè)元素糯景;其次是“治”,從最小數(shù)組開(kāi)始省骂,兩兩按大小順序合并蟀淮,直到并為原始數(shù)組大小,下面是圖解:

觀察下“治”的過(guò)程钞澳,可以看出怠惶,“治”實(shí)際上是將已經(jīng)有序的數(shù)組合并為更大的有序數(shù)組。那么怎樣將已經(jīng)有序的數(shù)組合并為更大的有序數(shù)組轧粟?很簡(jiǎn)單策治,創(chuàng)建一個(gè)臨時(shí)數(shù)組C,比較A[0]兰吟,B[0]通惫,將較小值放到C[0],再比較A[1]與B[0](或者A[0]混蔼,B[1])履腋,將較小值放到C[1],直到對(duì)A惭嚣,B都遍歷一遍遵湖。可以看出數(shù)組A晚吞,B都只需遍歷一遍延旧,所以對(duì)兩個(gè)有序數(shù)組的排序的時(shí)間復(fù)雜度為O(n)。

而“分”就是將原始數(shù)組逐次二分槽地,直到每個(gè)數(shù)組只剩一個(gè)元素垄潮,一個(gè)元素的數(shù)組自然是有序的烹卒,所以就可以開(kāi)始“治”的過(guò)程了。

時(shí)間復(fù)雜度分析:分的過(guò)程需要三步:log8 = 3弯洗,而每一步都需要遍歷一次8個(gè)元素,所以8個(gè)元素共需要運(yùn)行 8log8)次指令逢勾,那么對(duì)于 n 個(gè)元素牡整,時(shí)間復(fù)雜度為 O(nlogn)。

代碼中運(yùn)用了兩次遞歸溺拱,十分抽象難懂逃贝,畫(huà)了一整頁(yè)堆棧調(diào)用圖,才弄明白(太凌亂就不貼了)迫摔,大家可以試試沐扳。

// 融合兩個(gè)有序數(shù)組,這里實(shí)際上是將數(shù)組 arr 分為兩個(gè)數(shù)組
function mergeArray(arr, first, mid, last, temp) {
  let i = first; 
  let m = mid;
  let j = mid+1;
  let n = last;
  let k = 0;
  while(i<=m && j<=n) {
    if(arr[i] < arr[j]) {
      temp[k++] = arr[i++];
    } else {
      temp[k++] = arr[j++];
    }
  }
  while(i<=m) {
    temp[k++] = arr[i++];
  }
  while(j<=n) {
    temp[k++] = arr[j++];
  } 
  for(let l=0; l<k; l++) {
    arr[first+l] = temp[l];
  }
  return arr;
}
// 遞歸實(shí)現(xiàn)歸并排序
function mergeSort(arr, first, last, temp) {
  if(first<last) {
    let mid = Math.floor((first+last)/2);
    mergeSort(arr, first, mid, temp);    // 左子數(shù)組有序
    mergeSort(arr, mid+1, last, temp);   // 右子數(shù)組有序
    arr = mergeArray(arr, first, mid, last, temp);  
  }
  return arr;
}

// example
let arr = [10, 3, 1, 5, 11, 2, 0, 6, 3];
let temp = new Array();
let SortedArr = mergeSort(arr, 0 ,arr.length-1, temp);
alert(SortedArr);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末句占,一起剝皮案震驚了整個(gè)濱河市沪摄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纱烘,老刑警劉巖杨拐,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異擂啥,居然都是意外死亡哄陶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)哺壶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屋吨,“玉大人,你說(shuō)我怎么就攤上這事山宾≈寥牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵塌碌,是天一觀的道長(zhǎng)渊胸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)台妆,這世上最難降的妖魔是什么翎猛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮接剩,結(jié)果婚禮上切厘,老公的妹妹穿的比我還像新娘。我一直安慰自己懊缺,他們只是感情好疫稿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布培他。 她就那樣靜靜地躺著,像睡著了一般遗座。 火紅的嫁衣襯著肌膚如雪舀凛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天途蒋,我揣著相機(jī)與錄音猛遍,去河邊找鬼。 笑死号坡,一個(gè)胖子當(dāng)著我的面吹牛懊烤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宽堆,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腌紧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了畜隶?” 一聲冷哼從身側(cè)響起壁肋,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎代箭,沒(méi)想到半個(gè)月后墩划,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗡综,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年乙帮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极景。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡察净,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盼樟,到底是詐尸還是另有隱情氢卡,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布晨缴,位于F島的核電站译秦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏击碗。R本人自食惡果不足惜筑悴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稍途。 院中可真熱鬧阁吝,春花似錦、人聲如沸械拍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至甲馋,卻和暖如春埂奈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摔刁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工挥转, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人共屈。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像党窜,于是被迫代替她去往敵國(guó)和親拗引。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系幌衣,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算矾削,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,818評(píng)論 0 13
  • 1 初級(jí)排序算法 排序算法關(guān)注的主要是重新排列數(shù)組元素,其中每個(gè)元素都有一個(gè)主鍵豁护。排序算法是將所有元素主鍵按某種方...
    深度沉迷學(xué)習(xí)閱讀 1,408評(píng)論 0 1
  • 我的一個(gè)朋友哼凯,愚人節(jié),沒(méi)想去愚人楚里,卻于無(wú)意中試探了一回人心断部。 “你好!麻煩你借我200元班缎,有急用蝴光,謝謝〈镏罚” ...
    梅桂之約閱讀 388評(píng)論 0 2
  • 賺錢(qián)絕學(xué)思維全集30之(十八)——3 《聰明與智慧的區(qū)別》 人不怕不聰明蔑祟,就怕太聰明。 聰明一過(guò)頭就太會(huì)算計(jì)沉唠,便會(huì)...
    曾傳品牌研習(xí)社閱讀 192評(píng)論 0 0
  • 當(dāng)我開(kāi)始承認(rèn)孤僻 我拒絕了再次獲得關(guān)注的認(rèn)可疆虚。 我的愛(ài)逐漸生冷,且翩飛 我的朋友就算包容满葛, 也遲疑向我作出必要的解...
    闊云閱讀 314評(píng)論 0 2