歸並排序-marge-sort
1、為了解決一些給定的問題,算法要一次或者多次的遞歸調用自身來解決相關的子問題。這些算法通常采用分治的策略;將源問題劃分為規模較小而結構與原問題類似的子問題;遞歸調用解決這些子問題,然後合並。歸並排序算法采用了分治的思想來對數組進行排序。
2、原理,:把原始數組分成若幹子數組,對每一個子數組進行排序,繼續把子數組與子數組合並,合並後仍然有序,直到全部合並完,形成有序的數組
舉例
無序數組[6 2 4 1 5 9]
先看一下每個步驟下的狀態,完了再看合並細節
第一步 [6 2 4 1 5 9]原始狀態
第二步 [2 6] [1 4] [5 9]兩兩合並排序,排序細節後邊介紹
第三步 [1 2 4 6] [5 9]繼續兩組兩組合並
第四步 [1 2 4 5 6 9]合並完畢,排序完畢
輸出結果[1 2 4 5 6 9]
合並細節
詳細介紹第二步到第三步的過程,其余類似
第二步:[2 6] [1 4] [5 9]
兩兩合並,其實僅合並[2 6] [1 4],所以[5 9]不管它,
原始狀態
第一個數組[2 6]
第二個數組[1 4]
--------------------
第三個數組[...]
第1步,順序從第一,第二個數組裏取出一個數字:2和1
比較大小後將小的放入第三個數組,此時變成下邊這樣
第一個數組[2 6]
第二個數組[4]
--------------------
第三個數組[1]
第2步,繼續剛才的步驟,順序從第一,第二個數組裏取數據,2和4,
同樣的比較大小後將小的放入第三個數組,此時狀態如下
第一個數組[6]
第二個數組[4]
--------------------
第三個數組[1 2]
第3步,再重復前邊的步驟變成,將較小的4放入第三個數組後變成如下狀態
第一個數組[6]
第二個數組[...]
--------------------
第三個數組[1 2 4]
第4步,最後將6放入,排序完畢
第一個數組[...]
第二個數組[...]
--------------------
第三個數組[1 2 4 6]
[ 1 2 4 6 ]與[ 5 9 ]的合並過程與上邊一樣,不再分解
代碼僅供參考
static void merge(int[] unsorted, int first, int mid, int last, int[] sorted) { int i = first, j = mid; int k = 0; while (i < mid && j < last) if (unsorted[i] < unsorted[j]) sorted[k++] = unsorted[i++]; else sorted[k++] = unsorted[j++]; while (i < mid) sorted[k++] = unsorted[i++]; while (j < last) sorted[k++] = unsorted[j++]; for (int v = 0; v < k; v++) unsorted[first + v] = sorted[v]; } static void merge_sort(int[] unsorted, int first, int last, int[] sorted) { if (first + 1 < last) { int mid = (first + last) / 2; Console.WriteLine("{0}-{1}-{2}", first, mid, last); merge_sort(unsorted, first, mid, sorted); merge_sort(unsorted, mid, last, sorted); merge(unsorted, first, mid, last, sorted); } } static void Main(string[] args) { int[] x = { 6, 2, 4, 1, 5, 9 }; int[] sorted = new int[x.Length]; merge_sort(x, 0, x.Length, sorted); for (int i = 0; i < sorted.Length; i++) { if (x[i] > 0) Console.WriteLine(x[i]); } Console.ReadLine(); }
內容參考於http://www.cnblogs.com/kkun/archive/2011/11/23/2260271
歸並排序-marge-sort