歸併排序的思想其實完全是分治法的思想的體現,它完全遵循分治法的模式。
這裡有必要再重提下分治法的思想:
將原有的問題分解為幾個規模較小的但類似於原問題的子問題,遞迴的求解這些子問題,然後再合併這些子問題的解來求得原問題的解。
現在來看看歸併排序的操作:
1 將等待排序的含有 n 個元素的序列分解成各具有 n/2個元素的兩個子串行 (n為奇數時,某個子串行比另乙個會多乙個元素 但不會影響結果)
2 使用歸併排序遞迴的排序兩個子串行 ( 說白了就是把開始已分解的兩個子串行再各自往下分解 )
3 合併兩個已經排好序的子串行
我們有乙個序列 6 5 3 1 8 7 2 4
1 我們將其分為兩組 一組為 6 5 3 1 另一組為 8 7 2 4
2 對前面兩組再進行分解 6 5 和 3 1 以及 8 7 和 2 4
3 各小組進行排序得到 5 6 和 1 3 以及 7 8 和 2 4
4 5 6 和 1 3兩個小組進行合併 (比較並排序) 以及 7 8 和 2 4 兩個小組進行合併 (比較並排序) 得到兩個小組 1 3 5 6 和2 3 4 8
5 這兩個小組再合併 (比較並排序) 得到最終解 1 2 3 4 5 6 7 8
int array1[100]=,array2[100]=;//兩個陣列,用於記錄分解後的兩個子串行
void merge(int a,int p,int q,int r)
{ int n1=q-p+1;
int n2=r-q;
int i,j;
for(i=0;i
排序演算法 歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。首先考慮下如何將將二個有序數列合併。這個非常簡單,只要從比較二個數列的第乙個數,誰小就先取誰,取了後就在對應數列中刪除這個數。然後再進行比較,如果有數列為空,那直接將另...
排序演算法 歸併排序
include include define status int define max 20 typedef struct elemtype typedef struct sqlist void inital sqlist l 初始化 bool lt int i,int j void merge ...
排序演算法 歸併排序
歸併排序 英語 merge sort,或mergesort 是建立在歸併操作上的一種有效的排序演算法,效率為o n log n 該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。歸併操作也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序...