歸併排序的思想是基於分治法的思想之上的,也是有分解、解決、合併這三步。
分解:將n個元素的序列分成兩個子串行, 記為a[ 1 . . .n/2.]and a[ [n/2]+1 . . n ]
解決:將兩個子串行分別遞迴歸併排序
合併:將已有序的兩個子串行合併,得到有序的序列。
merge-sort a[1…n]
1.if n= 1, done.
2.recursively sort a[ 1 . . .n/2.]and a[ [n/2]+1 . . n ] .
3.「merge」 the 2 sorted lists.
key subroutine: merge(有序子列的歸併)
若將歸併演算法的時間複雜度記為t(n)
c1代價為1,c2代價為2t(n/2),c3代價為n(有序子列的歸併代價為n,詳情見merge的**實現)
故當n=1時,t(n)=θ(1);
當n>1時,t(n)=2t(n/2)+θ(n)
merge(有序子列的歸併)
void merge(int *arr,int *temparr, int l, int r, int right)
//*arr待合併序列,*temparr存放合併後序列
//l,r是待合併序列中子序列1的左、右位置; left,rigt子串行2的左、右位置
while(l<=r)
temparr[templ++]=arr[l++];
while(left<=right)
temparr[templ++]=arr[left++];
for(int k=0;kmergesort函式
//利用遞迴思想
void mergesort(int *sourcearr,int *resultarr,int startindex,int endindex)
//*sourcearr源序列,*resultarr排序後序列
;//c++陣列中序號從0~5,而長度為6
int len = sizeof(a)/sizeof(int);//獲取陣列長度
int b[len];
int n=len-1;//序列尾序號
mergesort(a,b,0,n);
for(int k=0;kcout<}
快速排序 歸併排序 演算法設計與分析
bubble sort bubbling merge sort divide and conquer 分而治之 quick sort location 元素定位 快速排序 int partition sqlist l,int low,int high l.r 0 l.r low pivorkey l...
演算法分析與設計作業4 歸併排序
二分歸併排序 對n個不同的數構成的陣列a 1 n 進行排序,其中n 2 k 先將雜亂的數字兩兩分組,對兩個數字比較大小進行排序,再將兩個排序好的陣列按順序歸併,依此迴圈k次,直至所有小陣列被歸併為完整的大陣列。void merge int num 1,int num 2,int i,int s,in...
演算法設計與分析 插入排序演算法與歸併排序演算法比較
通過插入排序演算法與歸併排序演算法效率對比體會演算法在求解問題中的重要性。分別編寫函式實現插入排序演算法和歸併排序演算法 利用隨機函式產生大量資料存入陣列作為待排序列 分別測試待排序列資料量為1000 1萬 10萬 100萬 1000萬的情況下兩種演算法各自的執行時間,通過對比分析研究哪個演算法在資...