歸併的思想就是將本是無序的陣列序列
通過兩兩合併排序後再合併,最終獲得乙個有序的陣列。如下圖。
二路歸併排序:
假設初始序列含有
n 個記錄,則可以看成是
n個有序的子串行,每個子串行的長度為
1 ,然後兩兩歸併,得到 ⌈n
2⌉個長度為
2 或
1的有序子串行;再兩兩歸併,..
....
,如此重複,直至得到乙個長度為
n 的有序序列為止。
下圖是二路歸併排序演算法過程的乙個例項:
一次二路歸併排序演算法的目標是把若干個長度為
k的相鄰有序子陣列從前向後進行兩兩歸併,得到個數減半的長度為 2k
的相鄰有序子陣列。
考慮到:
若元素個數為 2k
的整數倍,則兩兩歸併正好完成
n 個資料元素的一次二路歸併;
若元素個數不為 2k
的整數倍,則當歸併到最後一組時,剩餘的元素個數會不足 2k
個,這時的處理方法是:
/**
* 一次二路歸併排序演算法
* @param a 要排序的序列
* @param s 起始座標
* @param m 中間座標
* @param e 結束座標
*/function merge(a, s, m, e)
for (j = 0; j < n2; j++)
l[n1] = 10000000;
r[n2] = 10000000;
/* 將 前段資料與後段資料 比較由小到大歸併入 l 中 */
for (i = 0, j = 0, k = s; k <= e; k++)
else}}
2、歸併排序演算法
/**
* 歸併排序演算法
* @param a 要排序的序列
* @param s 起始座標
* @param e 結束座標
*/function mergesort(a, s, e)
}
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...