如果要排序乙個陣列,我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合併在一起,這樣整個陣列就都有序了。
實現思路:
遞推公式:merge_sort(p..r) = merge( merge_sort (p...q), merge-sort(q+1..r) )**:終止條件: p>=r不用再繼續分解
merge-sort(p...r)表示,給下標從p到r之間的陣列排序。我們將這個排序問題轉化為了兩個子問 ,題, merge_sort(p...q)和merge-sort(q+1..r),其中下標q等於p和r的中間位置,也就是, (p+r)/2,當下標從p到q和從q+1到r這兩個子陣列都排好序之後,我們再將兩個有序的子陣列合併在一起,這樣下標從p到r之間的資料就也排好序了。
// 歸併排序演算法, a是陣列,n表示陣列大小
public static void mergesort(int a, int n)
// 遞迴呼叫函式
private static void mergesortinternally(int a, int p, int r)
private static void merge(int a, int p, int q, int r) else
}// 2 判斷哪個子陣列中有剩餘的資料
int start = i;
int end = q;
if (j <= r)
// 3 將剩餘的資料拷貝到臨時陣列tmp
while (start <= end)
// 4 將tmp中的陣列拷貝回a[p...r]
for (i = 0; i <= r-p; ++i)
}
merge是這樣執行的:
**分析:
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。2 路歸併演算法 1.演算法基本思路 設兩個有序的子檔...
排序 歸併排序
利用遞迴的思想,當n 1時,只有乙個元素需要排序,為遞迴臨界條件 否則,遞迴的將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後再將得到的兩部分合併到一起。mergesort algorithm public void mergesort int data mergesort例程...