歸併排序的基本思想是將兩個或兩個以上的有序表組合成乙個新的有序表。來張醜圖:
來上**:
//歸併排序遞迴
void merge(int *arr, int start, int mid, int end)
else
}while (low <= mid)
while (high <= end)
for (int k = 0; k 是不是感覺遞迴那塊有點迷糊,來看下面這這張醜圖:
是不是感覺清晰點了,講真,不懂多畫圖,沒毛病!!
以上是歸併排序的遞迴實現,那麼如何將遞迴變為非遞迴呢?發現遞迴主要是一層一層進去,等到合併的兩個有序表為1的時候才開始合併,那麼我們是不是可以直接控制這兩個有序表的大小,沒錯,當然可以,看**:
//歸併排序非遞迴
void meger(int *arr, int len, int gap)
else
}while (l1 <= h1)
while (l2 <= h2)
//讓區間後移,繼續進行合併
l1 = h2 + 1;
h1 = l1 + gap - 1;
l2 = h1 + 1;
h2 = l2 + gap - 1 < len - 1 ? l2 + gap - 1 : len - 1;
} while (l1程式中用for迴圈直接控制了要歸併的序列的區間大小,即1,2,4,8,16
是不是感覺也非常的清晰,**中的l1,h1,l2,h2是自己定義的要歸併的序列的區間值。
來說下歸併排序的複雜度:
遞迴:
一趟歸併需要將待排序序列中的所有記錄掃瞄一遍,耗費o(n),整個歸併排序需要進行(log2n,以2為底n的對數向上取整)次,所以總的時間複雜度是o(n*logn)。
空間複雜度是o(n+logn)包括棧空間。
非遞迴:
避免了棧空間的消耗,避免遞迴也減少了時間時間開銷。建立歸併使用非遞迴。
歸併排序是兩兩比較,不存在跳躍,所以是穩定的一種排序。
歸併排序(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非遞...
python歸併排序 python 歸併排序
排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...