/*歸併排序
思想:1.分而治之,將乙個無序的數列一直一分為二,直到分到序列中只有乙個數的時候,這個序列肯定是有序的,因為只有乙個數,然後將兩個只含有乙個數字的序列合併為含有兩個數字的有序序列,這樣一直進行下去,最後就變成了乙個大的有序數列
2.遞迴的結束條件是分到最小的序列只有乙個數字的時候
時間複雜度分析:
最壞情況:t(n)=o(n*lg n)
平均情況:t(n)=o(n*lg n)
穩定性:穩定(兩個數相等的情況,不用移動位置
輔助空間:o(n)
特點總結:
高效耗記憶體(需要乙個同目標陣列sr相同大小的陣列來執行演算法)
*/#include
#define max 1024
intsr[max],tr[max];
int merge(int sr,int tr,int s,int m,int t)//
sr代表兩個有序序列構成的序列,s表示起始位置,m表示兩個序列的分解位置,但是sr[m]仍是屬於前面乙個序列,t表示結束位置
else
}while(i<=m)//
當前面乙個序列有剩餘的時候,直接把剩餘數字放在tr的後面
while(j<=t)//
當後面乙個序列有剩餘的時候,直接把剩餘數字放在tr的後面
return0;
}//該函式要求sr是由兩個有序序列構成
void copy(int sr,int tr,int s,int t)//
把tr賦給sr
}int mergesort(int sr,int s,int
t)else
//表示從s到t只有乙個數字(s==t),或者沒有數字(s>t)
return0;
}int
main()
mergesort(sr,
0,n-1);//
公升序排列
for(i=0;i)
printf("\n
");return0;
}
技術在於分享
分治法之歸併排序
參考學習的地方 在演算法設計中,如果對遞迴過程只有 模型的認識而沒有清晰的實踐的認識,最佳實踐就是在給每一層的遍歷新增乙個輸出,這樣就 可以驗證並把握遞迴的實質了。拓展 這種學習思想可用於專案中的測試,以及其他高 大難問題的分解驗證。歸併排序 難點是merge函式的設計 簡化就是用乙個陣列接收比較結...
分治法,歸併排序
1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...
分治法(歸併排序)
分治法.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define max 30 using namespace std int l max int r max void merge int a,int p,int q,int ...