PTA |1035 插入与归并 分数 25

262 阅读2分钟

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;
}