归并排序
归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。
归并排序将排序数组A[1…n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列:
**归并排序的时间复杂度为:O(nlgn),其中 MERGE(a,b,c,d)的时间复杂度为O(n)。**如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。
- 将n个元素分成各含有n/2个元素的子序列.
- 对两个子序列递归排序.
- 合并两个已排序的子序列以得到排序结果
.
void merge(int x,int y){
if(x==y)return;
int mid=(x+y)/2,i=x,j=mid+1,k=x;
merge(x,mid),merge(mid+1,y);
while(i<=mid&&j<=y){
if(a[i]<=a[j]){
c[k++]=a[i++];
}else{
c[k++]=a[j++],ans+