#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
typedef int ElementType;
void Merge(ElementType a[],ElementType tmpa[],int l,int r,int rend){//有序子列的归并
int len=rend-l+1;
int lend=r-1;
int tmp=l;
while(l<=lend&&r<=rend){
if(a[l]>a[r])
tmpa[tmp++]=a[r++];
else
tmpa[tmp++]=a[l++];
}
while(l<=lend)
tmpa[tmp++]=a[l++];
while(r<=rend)
tmpa[tmp++]=a[r++];
for(int i=0;i<len;i++,rend--){
a[rend]=tmpa[rend];
}
}
void Msort(int a[],int tmpa[],int l,int rend){//递归归并排序
if(l<rend){
int center=(l+rend)/2;
Msort(a,tmpa,l,center);//递归排序左边的
Msort(a,tmpa,center+1,rend);//递归排序右边的
Merge(a,tmpa,l,center+1,rend);//归并左右两个有序子列
}
}
void Merge_sort(int a[],int N){//统一函数接口
ElementType *tmpa=(ElementType*)malloc(sizeof(ElementType)*N);
if(tmpa!=NULL)
{Msort(a,tmpa,0,N-1);free(tmpa);}
else
printf("空间不足");
}
int main(){
srand(time(NULL));
int s[100];
for(int i=0;i<100;i++)
s[i]=rand()%1000;
Merge_sort(s,100);
for(int i=0;i<100;i++)
printf("%d ", s[i]);
return 0;
}
时间 O(NlogN)
空间 O(N)
稳定 true(相同的数排序前后是否交换了位置)