( merging sort )就是將兩個或兩個以上的有序表合併成一-個有序表的過程。將兩個有序表合併成個有序表的過程稱為2-路歸併,2-路歸併最為簡單和常用。
演算法思想:
假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到[n/2]個長度為2或1的有序子串行;再兩兩歸併,……,如此重複,直至得到乙個長度為1的有序序列為止。
書上的例子:
時間複雜度
o(nlog
2log_2
log2n)
空間複雜度
o(n)
演算法特點:
1)是穩定排序。
2)可用於鏈式結構,且不需要附加儲存空間,但遞迴實現時仍需要開闢相應的遞迴工作棧。
完整**:
#include
#include
#include
#define maxsize 100
//順序表最大容量,可以自行加大
typedef
struct
elemtype;
//記錄型別
typedef
struct
sqlist;
//順序表
void
initlist
(sqlist &l)
//順序表的初始化
void
createlist
(sqlist &l)
//順序表的建立
scanf
("%d"
,&l.data[l.length]
.key)
;//順序表資料的輸入 if(
getchar()
=='\n'
)//迴圈終止條件
break;}
}void
inputlist
(sqlist l)
//順序表的輸出
printf
("列印為:");
for(i=
1;i<=l.length;i++
)//利用迴圈列印順序表中的資料
printf
("%d "
,l.data[i]
.key);}
void
merge
(elemtype r,
int low,
int mid,
int high)
//將兩個有序表r[low…mid]和r[mid+1…high]歸併為有序表
while
(i<=mid)
//將剩餘的t[i…mid]複製到r中
r[k++
]= t[i++];
while
(j<=high)
//將剩餘的t[j…high]複製到r中
r[k++
]= t[j++];
}void
msort
(elemtype r,
int low,
int high)
//利用遞迴將r[low…high]歸併排序
}void
mergesort
(sqlist &l)
//對順序表l做歸併排序
(完)
C語言實現歸併排序
歸併排序 時間複雜度 o nlogn 空間複雜度 o n 穩定性 穩定 實現原理 採用分治法 divide and conquer 將已有序的子串行合併,得到完全有序的序列,即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,也叫二路歸併。實現 採用遞迴方法實現 include...
C語言實現歸併排序
歸併排序演算法完全遵循分治模式 偽 對分組歸併 merge a,p,q,r n1 q p 1 n2 r q let l 1.n1 1 and r 1.n2 1 be new arrays for i 1 to n1 l i a p i 1 for j 1 to n2 r j a q j l n1 1...
歸併排序的C語言實現
歸併排序的核心思想是 divide and conquer 演算法,即將要解決的size為n的問題,分成a個size為n b的子問題,這些子問題的結果經過o n d 的時間複雜度合併,即可解決最初的問題。所以,這一類的演算法,複雜度計算公式為 t n a t n b o n b 經過幾天的努力,終於...