先貼原始碼(歡迎大佬指正)
object sortimp
def msort[t]
(xs: list[t]
)(implicit ord: ordering[t]
): list[t]
= val n: int = xs.length / 2
if(n == 0) xs
else
}}
呼叫函式 msort 第二個引數implicit ord: ordering[t] 為比較器,這裡就不贅述了
直接上分析結果
將資料拆解到底(即單個元素)
merge(
merge(
merge(
merge(
) ,merge())
,megre()),
merge(
megre(
) ,megre()))
第一步合併+排序
merge(
merge(
merge(
,)
,),merge(
,))第二步合併+排序
merge(
merge(
,), )
第三步合併+排序
merge(,
)最終結果
歸併排序的進一步理解
歸併排序,顧名思義 先遞迴再合併的排序方式,一層一層的遞迴,當遞迴到最底層的時候,進行合併操作,這也是分治演算法的經典運用。首先是要進行把兩個有序的序列進行合併操作,需要借助輔助空間,先把有序序列儲存在輔助空間中,在從輔助空間把有序序列複製到原序列中,完成合併操作,相應 如下 void merge ...
一步一步寫演算法(之合併排序)
前面一篇部落格提到的快速排序是排序演算法中的一種經典演算法。和快速排序一樣,合併排序是另外一種經常使用的排序演算法。那麼合併排序演算法有什麼不同呢?關鍵之處就體現在這個合併上面。合併演算法的基本步驟如下所示 1 把0 length 1的陣列分成左陣列和右陣列 2 對左陣列和右陣列進行迭代排序 3 將...
一步一步寫演算法(之合併排序)
前面一篇部落格提到的快速排序是排序演算法中的一種經典演算法。和快速排序一樣,合併排序是另外一種經常使用的排序演算法。那麼合併排序演算法有什麼不同呢?關鍵之處就體現在這個合併上面。合併演算法的基本步驟如下所示 1 把0 length 1的陣列分成左陣列和右陣列 2 對左陣列和右陣列進行迭代排序 3 將...