PAT.B1035 插入与归并

返回目录在这里插入图片描述

题意

给出一个初始序列,可以将它使用插入或归并进行排序。再给出一个序列,问它是刚才初始序列哪种排序产生的,并输出下一步产生的序列。

样例(可复制)

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

提供易错样例

4
3 4 2 1
3 4 2 1
//output
2 3 4 1

注意点

  1. 本题数据量较小,所以输入输出时可以用cin和cout,排序过程中可以直接使用sort
  2. 插入过程的第一步是前两个数开始排序,而不是只对第一个数排序,如果不注意这点,第2号测试点会答案错误
#include <bits/stdc++.h>
using namespace std;

bool issame(int a[],int b[],int n){
    for(int i=0;i<n;i++)
        if(a[i]!=b[i])return false;
    return true;
}
void show(int a[],int n){
    for(int i=0;i<n;i++){
        cout<<a[i];
        if(i!=n-1)cout<<" ";
    }
}
int main(){
    int n;
    cin>>n;
    int a[n],b[n],tmp[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
        tmp[i]=a[i];
    }
    for(int i=0;i<n;i++)cin>>b[i];
    bool flag=true;
    for(int i=2;i<=n;i++){//插入排序
        sort(tmp,tmp+i);
        if(issame(tmp,b,n)){
            cout<<"Insertion Sort\n";
            sort(tmp,tmp+i+1);
            show(tmp,n);
            flag=false;
            break;
        }
    }
    bool print=false;
    if(flag){
        for(int step=2;step/2<=n;step*=2){//归并排序
            if(step!=2&&issame(a,b,n))print=true;
            for(int i=0;i<n;i+=step)sort(a+i,a+min(i+step,n));
            if(print){
                cout<<"Merge Sort\n";
                show(a,n);
                break;
            }
        }
    }
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽会微笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值