你可以在 的 mer 標籤中看到歸併排序的動畫。
歸併排序:
時間複雜度:o(nlogn)
空間複雜度:o(n)
基本思想:
分治思想。
8 6 2 3 1 5 7 4
分:8 6 2 3 | 1 5 7 4
分:8 6 | 2 3 | 1 5 | 7 4
分:8 | 6 | 2 | 3 | 1 | 5 | 7 | 4
並:8 | 6 | 2 | 3 | 1 | 5 | 7 | 4
並:6 8 | 2 3 | 1 5 | 4 7
並:2 3 6 8 | 1 4 5 7
並:1 2 3 4 5 6 7 8
首先在分的時候,對於乙個 8 個陣列陣列,分解成了 o(log8) 也就是 3 層
每一層進行排序後向上合併即可。這個合併的過程就是合併兩個有序的陣列。
合併兩個有序陣列可以做到 o(n) 級別的合併。
leetcode 的 88 題:
實現:
void
__merge
(int arr,
int l,
int mid,
int r)
int i = l, j = mid +1;
for(
int k = l; k <= r; k++
)else
if(j > r)
else
if(tmp[i - l]
< tmp[j - l]
)else}}
void
__mergesort
(int arr,
int l,
int r)
void
mergesort
(int arr,
int n)
優化
當元素已經有序了的時候,可以不再進行__merge
操作。
void
__mergesort
(int arr,
int l,
int r)
}
測試:
100 k個隨機數字:
歸併排序 : 0.022311 s
插入排序 : 7.63138 s
100 k個接近有序數字:
歸併排序 : 0.001231 s
插入排序 : 0.000419 s
可以看到,接近有序的情況下,歸併排序的時間耗費比插入排序高。
因為在接近有序的情況下,歸併排序也會進行分
操作,分的操作是 o(logn) 的。但是插入排序在接近有序情況下時間複雜度接近 o(n)。
eof
資料結構與演算法 歸併排序
include include include string include include include include algorithm using namespace std void merge vector input,int left,int mid,int right,vector...
資料結構與演算法(歸併排序)
歸併排序是採用分治法的乙個典型的應用,歸併排序的思想就是先遞迴分解陣列,在合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的前面的數,誰小就先取誰,取了後相應的指標就往後移一位,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。def merge sort alis...
資料結構與演算法 歸併排序
遞迴結束判斷 if size 1 return int temp int malloc n1 n2 sizeof int free temp 防止棧溢位 遞迴太深 在網上查了半天發現是函式名寫錯了,太不認真了!用遞迴實現 一定要有結束條件 void merging int a,int n1,int ...