归并排序步骤:
1.划分子问题
2.递归求解
3.合并
分治法分一种
时间复杂度:O(nlogn)
比快速排序更稳定
缺点:
1.用到辅助空间,空间消耗更大
2.需要复制回原数组
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N],T[N];
void merge_sort(int *A,int x,int y)
{
if(y-x>1)
{
int m=(x+y)/2;
int l=x,i=x,r=m;
merge_sort(A,x,m);
merge_sort(A,m,y);
while(l<m||r<y)///两个序列至少有一个不为空
{
if(r>=y||l<m&&A[l]<=A[r])
T[i++]=A[l++];///复制左边的
else T[i++]=A[r++];///复制右边的
}
for(int i=x; i<y; i++)///复制回原数组
A[i]=T[i];
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
merge_sort(a,0,n);
for(int i=0; i<n; i++)
printf("%d ",a[i]);
printf("\n");
}
return 0;
}