首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

PAT乙级-1035 插入与归并 (25分)

  • 24-02-22 06:40
  • 2094
  • 12108
blog.csdn.net

点击链接PAT乙级-AC全解汇总

题目:
根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:
输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:
首先在第 1 行中输出Insertion Sort表示插入排序、或Merge Sort表示归并排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

输入样例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
  • 1
  • 2
  • 3

输出样例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0
  • 1
  • 2

输入样例 2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
  • 1
  • 2
  • 3

输出样例 2:

Merge Sort
1 2 3 8 4 5 7 9 0 6
  • 1
  • 2

我的代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

bool is_Insertion(int src_[],int add[],int N)
{//插入排序
    int src[N];
    for(int i=0;i<N;i++)src[i]=src_[i];
    bool flag=false;
    for(int i=1;i<N;i++)
    {
        //迭代一轮
        for(int j=i;j>0;j--)
        {
            if(src[j]<src[j-1])
            {
                int t=src[j];
                src[j]=src[j-1];
                src[j-1]=t;
            }
        }
        //如果是目标序列之后再进行一轮后输出
        if(flag)
        {
            cout<<"Insertion Sort"<<endl;
            for(int i=0;i<N-1;i++)
            {
                cout<<src[i]<<" ";
            }
            cout<<src[N-1];
            return true;
        }
        //判断是否为目标序列
        int k=0;
        for(;k<N;k++)
        {
            if(src[k]!=add[k])break;
        }
        if(k==N)flag=true;
    }
    return false;
}
int main()
{
    int N;
    scanf("%d\n",&N);
    int src[N],add[N];
    for(int i=0;i<N;i++)cin>>src[i];
    for(int i=0;i<N;i++)cin>>add[i];
    //Insertion Sort
    if(!is_Insertion(src,add,N))
    {//Merge Sort
        cout<<"Merge Sort"<<endl;
        //归并排序本身是递归,所以做这道题并不能用归并排序来做
        //只能按照先两两排序,再四四排序...每次间隔为step
        bool flag=false;
        for(int step=2;step<=N;step*=2)//如果不是<=case3过不去
        {
            //迭代一轮分成n个step
            int start=0;
            while(start<N-N%step)
            {
                //将start到start+step-1部分从小到大排
                sort(src+start,src+start+step);
                start+=step;
            }
            //排序一下剩余部分,不然case5 6报错
            sort(src+start,src+N);
            //如果是目标序列之后再进行一轮后输出
            if(flag)
            {
                for(int i=0;i<N-1;i++)
                {
                    cout<<src[i]<<" ";
                }
                cout<<src[N-1];
                return 0;
            }
            //判断是否为目标序列
            int k=0;
            for(;k<N;k++)
            {
                if(src[k]!=add[k])break;
            }
            if(k==N)flag=true;
        }
    }
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98

有的时候题目是一起做的,所以会有不需要的头文件

要注意这道题并不是考察排序算法的实现,而是逻辑
注意归并的时候要把尾部余下的一些数排序
注意归并排序当N正好为2的指数倍的情况,即step可以等于N

注:本文转载自blog.csdn.net的邂逅模拟卷的文章"https://blog.csdn.net/qq_34451909/article/details/104778709"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top