歸併排序
歸併排序,又稱為合併排序,它是把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體有序序列。
使用的d&c的思想:
分解:將n個元素分解為各含n/2個元素的子串行;
解決:用合併排序法對兩個子串行進行遞迴的排序;
合併:合併兩個已經排好的子串行以得到正確結果。
歸併排序的速度僅次於快速排序,為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的數列。其最好,最壞,平均時間複雜度都是o(nlogn)。
1void merge(int a, int p, int q, int r)//
對兩個已經排好序的子數列進行合併 2
10for(int j = 1; j <= n2; j++)
1114 l[n1+1] = maxn;//
哨兵值,前面定義maxn為乙個很大的數
15 r[n2+1] = maxn;//
使用這個哨兵值是為了避免檢查每個子串行是不是空的。所有的數都不會比它大
16int i = 1
; 17
int j = 1;18
for(int k = p; k <= r; k++)//
有序的分別將小的數重新插入元序列中
19
25else26
30}
31}
3233
void merge_sort(int a, int p, int
r)34
42 }
排序4 歸併排序
歸併排序 merge sort 完全遵循上述分治法三個步驟 1 分解 將要排序的n個元素的序列分解成兩個具有n 2個元素的子串行 2 解決 使用歸併排序分別遞迴地排序兩個子串行 3 合併 合併兩個已排序的子串行,產生原問題的解。所以說歸併排序一種分治演算法的典型應用。歸併排序過程動態演示 時間複雜度...
排序4 歸併排序
3.海量資料的排序問題 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併排序適合於外部排序,也可以適用於鍊錶排序。外部排序 指的是資料儲存在磁碟上。鍊錶排序 希爾 堆排序 快速排序等均不適...
幾種排序分享 歸併排序
這裡參考自 狄泰 資料結構課程 基本思想 將兩個或兩個以上的有序序列合併成乙個有序序列 意思就是 v 0 v 1 v 02 v m 和 v m v m 1 v m 2 v n 1 合併 為 v 0 v 1 v 02 v n 1 看下圖 舉例 直接上 template typename t void ...