經典排序演算法 歸併排序Merge sort

2021-07-06 08:09:08 字數 1696 閱讀 1561

經典排序演算法 - 歸併排序merge sort

原理,把原始陣列分成若干子陣列,對每乙個子陣列進行排序,

繼續把子陣列與子陣列合併,合併後仍然有序,直到全部合併完,形成有序的陣列 舉例

無序陣列[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)

static void merge_sort(int unsorted, int first, int last, int sorted)

--", 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 sorted = new int[x.length];

merge_sort(x, 0, x.length, sorted);

for (int i = 0; i < sorted.length; i++)

console.readline();

}

歸併排序Merge

歸併排序 歸併排序是一種基於分治法的一種排序方法。它將要排序的序列分成兩個長度相等的子串行,為每乙個子串行進行排序,然後再將子串行合併成乙個有序的序列。歸併排序 時間複雜度 o n logn 空間複雜度 o n 穩定性 穩定排序 第乙個區間 beg,mid 第二個區間 mid,end void me...

經典演算法 歸併排序

題目說明 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法也是採用分治法 divide and conquer 的乙個非常典型的應用。演算法複雜度為o n logn 題目解析 歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半...

經典排序演算法之 歸併排序

1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併的時間為o n 故其時間複雜度...