一、源**
源**來自coursera 《scala函式式程式設計原理》def msort[t](xs:list[t])(lt: (t,t) => boolen):list[t]=
val (fst,snd) = xs splitat n
merge(msort(fst)(lt),msort(snd)(lt))
}}
其中,msort函式的第二個引數——lt: (t,t) => boolen,它是乙個自定義的謂詞比較方法,用於比較t型別物件的大小,這裡不做討論。
二、示例
list元素:ls : list[int]=
拆分的圖示:msort()
merge(msort(),msort())
對於msort()的遞迴
=>merge(msort(),msort())
對於msort()的遞迴
=>merge(msort(),msort())
=>merge(7,4)
對於msort()的遞迴
=>merge(msort(),msort())
=>merge(43,9)
merge(merge(msort(),msort()),merge(msort(),msort()))
merge(merge(merge(msort(),msort()),15),merge(43,9))
merge(merge(merge(7,4),15),merge(43,9))//這是一系列的拆分過程
上面是乙個拆分過程,之後進行列表的兩兩合併:
每次合併後,都會形成有序的列表,所以問題轉化成了——對兩個有序的列表進行排序。回顧merge函式,它借用msort對引數進行分解。也就是說merge函式的兩個列表引數一定是有序的——在merge函式體內,就是對兩個列表有序列表進行合併排序的過程。
三、原理
1.將待排序的列表拆分成包含單個元素的列表
2.拆分的列表元素列表兩兩合併並排序,直到合併成乙個列表。
四、遞迴函式的輸入和輸出
1. msort函式:傳入乙個待排序列表,輸出乙個排序後的列表。
2.merge函式:傳入兩個有序的列表,輸出乙個有序的列表。
五、遞迴的解釋
程式中出現的遞迴有這幾處:
1.merge函式的引數使用msort做了拆分的遞迴操作。
2.merge對兩個引數進行排序使用了merge函式。這裡的遞迴更像一種功能的重用——合併兩個有序列表的功能。
遞迴的退出條件:
1.msort函式:待排序的列表只有乙個元素或者為空列表
2.merge函式:兩個引數中有乙個為空列表
遞迴部分的處理:
msort使用merge函式返回乙個有序列表
merge使用merge函式自身將兩個有序列表進行合併
很明顯,遞迴交由merge函式處理,也就是說,merge能夠達到自身退出遞迴的條件—— 一直呼叫merge函式會形成,引數中只有乙個列表的情況。所以,這裡的msort函式只是提供了乙個拆分的功能——輔助merge函式,將乙個列表折半成兩個列表的功能。
目前為止,重點就是merge函式合併兩個有序列表的方法,這裡通過提取出最小的乙個元素,並merge剩下的元素來縮減,針對和的merge函式的遞迴合併過程如下圖:
這就實現了對兩個有序列表進行排序的過程。對於歸併排序的總結就是兩點:
1.使用msort對待排序的列表進行拆分,直到形成含單個元素的列表。
2.使用merge對兩個有序列表進行合併,直到形成乙個列表為止。
歸併排序詳細解析
我們先來乙個兩個有序的陣列a和b進行排序的 兩個有序的陣列進行排序只需每次選擇兩個陣列中最小的那個數放進c中就ok了,之後如果那個陣列還有剩餘就將其直接接在c後面。時間效率還是很快的達到了o n python原始碼 def memeryarray a,b,c i 0 j 0 k 0 n len a ...
歸併排序和案例解析
排序是資料結構中重要的乙個問題領域也是現實生活和面試時比較容易遇到和考到的乙個知識點,所以本篇部落格就說下歸併排序 其他的排序後面也會出部落格講解 總體介紹 歸併排序是乙個遞迴加分治的思想完成的,對於陣列問題,總的來說就是把左子陣列排好序再把右子陣列排好序,最後在對左右有序陣列進行歸併 即一起排序的...
歸併排序(2 路歸併排序)
遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...