PTA | 程序设计类实验辅助教学平台 (pintia.cn)
思想
首先我们输入a1,a2两个数组,先把a1的值给a3,让a3先去做个插入排序,排完之后我们看a3是否和a2一样,一样的话说明是插入排序,就输出 “Insertion Sort”,然后再排一位输出结果
如果不和a2一样,说明是归并排序,我们就输出"Merge Sort",然后按照归并排序的特性进行排序,最后输出。
#include <bits/stdc++.h>
using namespace std;
int a[102];
int b[102];
int temp[102];
bool arrycmp(int c[],int n) //数组比较
{
for(int i=0;i<n;i++)
{
if(c[i]!=b[i])
return false; //两个数组不相等
}
return true; //两个数组相等
}
void printarry(int a[],int n) //打印结果
{
for(int i=0;i<n;i++)
{
cout<<a[i];
if(i!=n-1) //数组最后一位后面不打印空格,其他的每个一位都要打印一个空格
cout<<" ";
}
}
bool InsertSort(int a[],int n) //判断是否是插入排序
{
int count=2;
for(;count<=n;count++)
{
sort(a,a+count);
if(arrycmp(a,n)) //两个数组相等
{
cout<<"Insertion Sort"<<endl;
sort(a,a+count+1);
printarry(a,n);
return true; //匹配成功!
}
}
return false;
}
void MergeInsert(int a[],int n) //判断是否是归并排序
{
int count=1;
int pos;
for(;count<=n;)
{
for(int i=0;i+count<=n;i+=count,pos=i)
{
sort(a+i,a+i+count);
}
if(pos<n)
sort(a+pos,a+n);
if(2*count>=n)
count=n;
else
count*=2;
if(arrycmp(a,n)) //如果匹配成功
{
cout<<"Merge Sort"<<endl;
for(int i=0;i+count<=n;i+=count,pos=i)
sort(a+i,a+i+count);
if(pos<n)
sort(a+pos,a+n);
printarry(a,n);
break;
}
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
temp[i]=a[i];
}
for(int i=0;i<n;i++)
cin>>b[i];
if(!InsertSort(a,n)) //如果不是插入排序
MergeInsert(temp,n); //那就是归并排序
return 0;
}