二路归并排序
- 实现思想
- 将两个位置相邻的记录有序子序列归并为一个记录有序的序列。
- 时间复杂度
- 最好情况:O(nlogn)
- 最坏情况:O(nlogn)
- 平均时间复杂度:O(nlogn)
- 空间复杂度
- 稳定性
代码
#include<stdio.h>
void Merge(int tr[],int r[],int i,int m,int n){
int j,k;
for(j=m+1,k=i;i<=m&&j<=n;k++){
if(tr[i]<tr[j])
r[k]=tr[i++];
else
r[k]=tr[j++];
}
while(i<=m)
r[k++]=tr[i++];
while(j<=n)
r[k++]=tr[j++];
}
void MSort(int r1[],int r2[],int i,int n){
int m;
int tr[9];
if(r1[i]==r1[n])
r2[i]=r1[i];
else{
m=(i+n)/2;
MSort(r1,tr,i,m);
MSort(r1,tr,m+1,n);
Merge(tr,r2,i,m,n);
}
}
void Output(int rcd[],int len){
int i;
for(i=1;i<=len;i++){
printf("%d ",rcd[i]);
}
printf("\n");
}
void main(){
int len=8;
int rcd[9]={0,3,1,7,5,2,4,9,6};
printf("未排序的集合为:\n");
Output(rcd,len);
MSort(rcd,rcd,1,len);
printf("从小到大排序后的集合为:\n");
Output(rcd,len);
}