#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int maxn;
void Merge(int s,int m,int t,int A[],int B[])
{
int i=s,j=m+1,k=s;
while(i<=m&&j<=t)
{
if(A[i]<=A[j])
B[k++]=A[i++];
else
B[k++]=A[j++];
}
while(i<=m)
B[k++]=A[i++];
while(j<=t)
B[k++]=A[j++];
for(int i=s;i<=t;i++)
A[i]=B[i];
}
void MergePass(int n,int h,int A[],int B[])
{
int i;
for(i=0;i+2*h-1<n;i=i+2*h)
Merge(i,i+h-1,i+2*h-1,A,B);
if((i+h)<n)
Merge(i,i+h-1,n-1,A,B);
else
for(int j=i;j<n;j++)
B[j]=A[j];
}
void MergeSort(int n,int A[],int B[])
{
int h=1;
while(h<n)
{
MergePass(n,h,A,B);
h=2*h;
}
}
int main()
{
//生成待排序数组C
int sequence;
int *A,*B;
clock_t start,endn;
printf("请选择数据规模:\n");
scanf("%d",&maxn);
A = (int *)malloc(sizeof(int)*maxn);
B = (int *)malloc(sizeof(int)*maxn);
printf("请选择数据序列类型?1.有序2.无序3.倒序\n");
scanf("%d",&sequence);
printf("生成数据...\n");
if(sequence==1)
for(int i=0;i<maxn;i++)
A[i]=i+1;
else if(sequence==2)
for(int i=0;i<maxn;i++)
A[i]=rand()%100;
else
for(int i=maxn;i>=0;i--)
A[i]=maxn-i;
for(int i=0;i<maxn;i++)
B[i]=A[i];
printf("生成完毕\n");
/*for(int i=0;i<maxn;i++)
printf("%d ",A[i]);
printf("\n");*/
//进行二路归并排序
printf("开始排序并计时...\n");
start=clock();
MergeSort(maxn,A,B);
endn=clock();
printf("排序完成,计时结束\n");
//输出结果
printf("执行时间为:");
printf("%.3fs\n",(double)(endn-start)/CLK_TCK);
/*for(int i=0;i<maxn;i++)
printf("%d ",B[i]);*/
free(A),free(B);
return 0;
}
时间复杂度分析:
空间复杂度分析:实现两个数组合并时需要额外的辅助数组B[n],空间开销为n。空间复杂度为