1035. 插入与归并(25) PAT乙级&&1089. Insert or Merge (25)PAT甲级

本文介绍了一种基于传送门概念的排序算法实现,通过插入排序和归并排序两种方法完成特定序列的排序,并展示了如何判断排序过程是否符合预期。代码中详细解释了每一步操作,包括比较数组是否相同、显示数组状态、插入排序的具体步骤以及归并排序的过程。

甲级传送门

乙级传送门

#include<stdio.h>
#include<algorithm>
#define MAX_N 110

using namespace std;


int n;

int aim[MAX_N];
int ins[MAX_N];
int merg[MAX_N];

bool isSame(int a[],int b[]){
    bool flag=true;
    for(int i=0;i<n;i++){
        if(a[i]!=b[i]){
            flag=false;
            return false;
        }
    }
    return true;
}

void show(int a[]){
    for(int i=0;i<n;i++){
        printf("%d",a[i]);
        if(i!=n-1)  printf(" ");
    }
    printf("\n");
}



bool insert(){
    bool flag=false;
    for(int i=1;i<n;i++){
        if(i!=1&&isSame(ins,aim)){
            flag=true;
        }

        int key=ins[i];
        int j=i;
        while(j>0&&ins[j-1]>key){
            ins[j]=ins[j-1];
            j=j-1;
        }
        ins[j]=key;

        if(flag){
            return true;
        }
    }
    return false;
} 

void mergesort(){
    bool flag=false;
    for(int i=2;i/2<=n;i*=2){
        if(i!=2&&isSame(aim,merg)){
            flag=true;
        }
        for(int j=0;j<n;j+=i){
            sort(merg+j,merg+min(j+i,n));
        }
        if(flag){
            show(merg);
            return ;
        }
    }
}

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&ins[i]);
        merg[i]=ins[i];
    }
    for(int i=0;i<n;i++){
        scanf("%d",&aim[i]); 
    }
    if(insert()){
        printf("Insertion Sort\n");
        show(ins);
    }
    else{
        printf("Merge Sort\n");
        mergesort();
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值