1089. Insert or Merge (25)
注:存在等值数据
#include <stdio.h>
#include <stdlib.h>
int n,b[101],a[101];
int comp(const void*a,const void*b)
{
return *((int*)a)-*((int*)b);
}
int juge(int s,int e)
{
if(s>=e)return 1;
while(s<e&&a[s]<a[s+1])++s;
return s==e;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&b[i]);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
int step=2,ismerge=0;
while(1)
{
int s=1;
while(s+step-1<=n&&juge(s,s+step-1))
s+=step;
if(s+step-1<=n)break;
if(juge(s,n)&&step==2)
ismerge=1;
step*=2;
}
if(ismerge)
{
printf("Merge Sort\n");
int i=1;
while(i+step-1<=n)
{
qsort(&a[i],step,sizeof(int),comp);
i+=step;
}
if(i<=n)
qsort(&a[i],n-i+1,sizeof(int),comp);
}
else
{
printf("Insertion Sort\n");
int i=1,k;
while(i<n&&a[i]<=a[i+1])++i;
qsort(&a[1],i+1,sizeof(int),comp);
}
for(int i=1;i<=n;++i)
{
printf("%d",a[i]);
if(i!=n)printf(" ");
}
return 0;
}