输入一段原始序列,输入一段排序后的序列,判断是插入排序还是归并排序得到的,并再进行一次该排序
输入:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
将两个排序写出来,归并用非递归类型,每次执行一次就判断,如果满足就输出。
#include<stdio.h>
#include<stdlib.h>
#define MAX 101
int b[MAX];
int match(int a[],int b[],int n)
{
for(int i=0;i<n;i++)
if(a[i]!=b[i])
return 0;
return 1;
}
int insert_sort(int a[],int n)
{
int i,j,temp,flag=0;
for(i=1;i<n;i++)
{
temp=a[i];
for(j=i;j>0&&a[j-1]>temp;j--)
a[j]=a[j-1];
a[j]=temp;
if(match(a,b,n))
{
flag=1;
int x=i+1,y;
temp=a[x];
//再进行一次插入排序
for(y=x;y>0&&b[y-1]>temp;y--)
b[y]=b[y-1];
b[y]=temp;
break;
}
}
return flag;
}
void merge(int a[],int l,int r,int rend,int temp[])
{
int length,lend,tmp=l,i;
length=rend-l+1;
lend=r-1;
while(l<=lend&&r<=rend)
{
if(a[l]<a[r])
temp[tmp++]=a[l++];
else
temp[tmp++]=a[r++];
}
while(l<=lend)
temp[tmp++]=a[l++];
while(r<=rend)
temp[tmp++]=a[r++];
for(i=rend+1-length;i<=rend;i++)
a[i]=temp[i];
}
void merge_pass(int a[],int temp[],int n,int length)
{
int i,j;
for(i=0;i<=n-2*length;i+=2*length)
merge(a,i,i+length,i+2*length-1,temp);
if(i+length<n)
merge(a,i,i+length,n-1,temp);
else
for(j=i;j<n;j++)
temp[j]=a[j];
}
void print(int b[],int N)
{
int i;
for(i=0;i<N-1;i++)
printf("%d ",b[i]);
printf("%d\n",b[i]);
}
int mergesort(int a[],int n)
{
int length=1,flag=0;
int temp[n];
while(length<n)
{
merge_pass(a,temp,n,length);
length*=2;
//每归并一次就判断是否相等
if(match(temp,b,n)==1)
{
flag=1;
merge_pass(temp,b,n,length);
break;
}
merge_pass(temp,a,n,length);
length*=2;
if(match(a,b,n)==1)
{
flag=1;
merge_pass(a,b,n,length);
break;
}
}
return flag;
}
int main()
{
int i,N;
scanf("%d",&N);
int a[N],c[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N;i++)
c[i]=a[i];
for(i=0;i<N;i++)
scanf("%d",&b[i]);
if(insert_sort(a,N)==1)
printf("Insertion Sort\n");
else if(mergesort(c,N)==1)
printf("Merge Sort\n");
print(b,N);
return 0;
}