排序算法之歸并排序

本文將介紹排序算法中的歸并排序丸氛,學(xué)習(xí)歸并排序需要很好地理解計(jì)算機(jī)中的分治思想和遞歸思想罚舱。

1 分治思想

歸并排序井辜,利用分而治之的思想,將大的問題管闷,轉(zhuǎn)換成簡(jiǎn)單的粥脚,小的問題來(lái)解決。分治包个,字面上的解釋是“分而治之”刷允,就是把一個(gè)復(fù)雜的問題分成兩個(gè)或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最后子問題可以簡(jiǎn)單的直接求解碧囊,原問題的解即子問題的解的合并树灶。在計(jì)算機(jī)科學(xué)中,分治法就是運(yùn)用分治思想的一種很重要的算法糯而。它的核心思想可以用一句話來(lái)概括:大事化小天通,小事化了。

使用分治法解決問題熄驼,需要有兩部分內(nèi)容像寒,一部分是分解,將問題不停分解成更小的子問題谜洽,當(dāng)問題小到一定規(guī)模時(shí)萝映,可以比較容易地解決。一部分是合并阐虚,當(dāng)子問題被解決時(shí)序臂,要通過一定的方法,合并出原問題的解。

2 歸并排序

歸并排序是怎么分的呢奥秆?我們要對(duì)n個(gè)數(shù)排序逊彭,直接排太麻煩,拆成對(duì)兩部分构订,對(duì)n/2個(gè)數(shù)排序侮叮,把它們合并成一個(gè)有序數(shù)組,就是答案悼瘾。對(duì)n/2個(gè)數(shù)排序還是太復(fù)雜囊榜,繼續(xù)二分下去,n/4亥宿,n/8卸勺,n/16……直到分到最小,也就是長(zhǎng)度為1為止烫扼。這個(gè)時(shí)候就不用分了曙求。因?yàn)殚L(zhǎng)度為1本身已經(jīng)有序了。

image

如圖是歸并排序的一個(gè)例子映企,前四行是對(duì)問題進(jìn)行分解悟狱,后四行是對(duì)子問題進(jìn)行合并,最終得到原始問題的解堰氓。

使用分治的思想解決計(jì)算機(jī)的問題挤渐,分解的部分是比較簡(jiǎn)單的,合并的部分是比較難的双絮,并且這部分的效率也影響到了算法的整體效率挣菲。

對(duì)于歸并排序來(lái)說,合并部分的任務(wù)是掷邦,把有序序列合并成一個(gè)完整的有序序列。怎么合并呢椭赋?

image

我們把有序序列1和2進(jìn)行合并抚岗,需要另外一片新的空間,用來(lái)存放合并后的數(shù)組哪怔。我們首先比較序列1和2的開頭宣蔚,由于是有序序列,開頭就是最小的元素认境。比較兩個(gè)元素看誰(shuí)更小胚委,把最小的那個(gè)元素添加到合并序列中。添加完之后叉信,把該元素從序列里移除(實(shí)際代碼中并不會(huì)移除亩冬,而是指針直接指向下一個(gè)位置)。以上面圖①為例,2和3比較硅急,2比較小覆享,填入到合并序列中。然后把2去掉营袜。變成②中的情況撒顿。再把3和5比較,3比較小荚板,加入到合并序列中凤壁,把3從原始序列中去掉。如此反復(fù),直到序列1和2都合并完畢袭灯。

如果出現(xiàn)一個(gè)序列已經(jīng)空了胧瓜,另一個(gè)序列還有多個(gè)元素,直接把這些元素添加到合并序列最后面即可徙鱼。

3 代碼解析

image

merge_sort函數(shù)定義了長(zhǎng)度為n的輔助數(shù)組,用于歸并排序中合并的過程针姿。

sort函數(shù)袱吆,對(duì)數(shù)組進(jìn)行分割,將問題劃分為左半部分和右半部分兩個(gè)子問題距淫,之后將兩個(gè)子問題進(jìn)行合并绞绒。注意到這里使用了遞歸,使得問題不斷分解榕暇,直到left>=right蓬衡,此時(shí)子問題的數(shù)組長(zhǎng)度為1。

對(duì)遞歸不了解的可以查看

要理解遞歸彤枢,你先要理解遞歸?mp.weixin.qq.com
圖標(biāo)

merge函數(shù)是歸并排序中合并的部分狰晚。它對(duì)兩個(gè)有序序列進(jìn)行合并,合并成大的有序序列缴啡。這部分看代碼不難理解壁晒。

4 效率分析

歸并排序的時(shí)間復(fù)雜度T(n),每次可以分解出相同規(guī)模的子問題,并且這兩個(gè)子問題合并的復(fù)雜度為O(n)业栅,則T(n)=2T(n/2)+O(n)秒咐,根據(jù)主定理可以得到T(n)=O(nlogn)。需要注意的是碘裕,合并部分的時(shí)間復(fù)雜度如果過高携取,比如為O(n^2),會(huì)導(dǎo)致整體時(shí)間復(fù)雜度變大帮孔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雷滋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惊豺,老刑警劉巖燎孟,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尸昧,居然都是意外死亡揩页,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門烹俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爆侣,“玉大人,你說我怎么就攤上這事幢妄⊥醚觯” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蕉鸳,是天一觀的道長(zhǎng)乎赴。 經(jīng)常有香客問我,道長(zhǎng)潮尝,這世上最難降的妖魔是什么榕吼? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮勉失,結(jié)果婚禮上羹蚣,老公的妹妹穿的比我還像新娘。我一直安慰自己乱凿,他們只是感情好顽素,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著徒蟆,像睡著了一般胁出。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上段审,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天划鸽,我揣著相機(jī)與錄音,去河邊找鬼戚哎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嫂用,可吹牛的內(nèi)容都是我干的型凳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘱函,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甘畅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疏唾,失蹤者是張志新(化名)和其女友劉穎蓄氧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體槐脏,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喉童,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顿天。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堂氯。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牌废,靈堂內(nèi)的尸體忽然破棺而出咽白,到底是詐尸還是另有隱情,我是刑警寧澤鸟缕,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布晶框,位于F島的核電站,受9級(jí)特大地震影響懂从,放射性物質(zhì)發(fā)生泄漏授段。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一莫绣、第九天 我趴在偏房一處隱蔽的房頂上張望畴蒲。 院中可真熱鬧,春花似錦对室、人聲如沸模燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蔫骂。三九已至,卻和暖如春牺汤,著一層夾襖步出監(jiān)牢的瞬間辽旋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工檐迟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留补胚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓追迟,卻偏偏與公主長(zhǎng)得像溶其,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敦间,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • 歸并排序和快速排序都用到了分治思想,非常巧妙厢绝。我們可以借鑒這個(gè)思想契沫,來(lái)解決非排序的問題。 歸并排序 歸并排序的核心...
    被吹落的風(fēng)閱讀 1,330評(píng)論 0 3
  • 冒泡排序昔汉、插入排序懈万、選擇排序這三種算法的時(shí)間復(fù)雜度都為 ,只適合小規(guī)模的數(shù)據(jù)挤庇。今天钞速,我們來(lái)認(rèn)識(shí)兩種時(shí)間復(fù)雜度為 ...
    seniusen閱讀 2,319評(píng)論 2 17
  • 歸并排序和快速排序類似,都典型以遞歸方式實(shí)現(xiàn)的算法嫡秕,歸并排序的時(shí)間復(fù)雜度分析也和快速排序的時(shí)間復(fù)雜度分析類似渴语。本文...
    涂印閱讀 2,164評(píng)論 0 2
  • 歸并排序 歸并排序是用到了分治的思想,分治的思想是將一個(gè)大問題拆分成很多的小問題昆咽,然后再將已經(jīng)處理完成的小問題合并...
    羋學(xué)僧閱讀 247評(píng)論 0 0
  • 歸并排序是一種穩(wěn)定的算法驾凶,采用分治的思想,將有序的子序列合并得到有序的序列掷酗。具體的實(shí)現(xiàn)步驟為: 將序列分為長(zhǎng)度為n...
    葉孤陳閱讀 127評(píng)論 0 0