[PAT解题报告] Insert or Merge

给定一个整数数组,问当前的撞状态是插入排序造成的还是归并排序造成的。
题目给定了插入排序和归并排序的过程,特点如下:
(1) 插入排序,每次一定是前m项有序。
(2) 归并排序,每次一定是长度为2^k的段有序。
因为n不大(才100),所以我没有真正模拟这两个排序过程。
对于插入排序,我每次调用sort(c, c + m)
对于归并,我每段单独调用sort,注意长度可能有尾巴。
直接暴力排序比较就好了。
注意点: 不是找到第一个相同步骤就行了,而是应该找到第一个不同的步骤,因为有时候可能目前这个状态能在某种排序下面持续不变,例如插入排序时,输入数组前m项已经排好顺序了,我们可以需要找到第一个不一样的序列,换句话说,输出和输入必须时不同的。

代码:
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

int a[105], b[105], c[105];


void print(int *a,int n) {
        for (int i = 0; i < n; ++i) {
                if (i) {
                        putchar(' ');
                }
                printf("%d",a[i]);
        }
        puts("");
}

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

bool insertion(int *c, int n) {
bool mark = false;
        for (int i = 2; i <= n; ++i) {
        sort(c, c + i);
                if (same(c, b, n)) {
                        mark = true;
                }
        if (mark && (!same(c, b, n))) {
            puts("Insertion Sort");
            print(c, n);
            return true;
        }

        }
        return false;

}



bool merge(int *c,int n) {
bool mark = false;
        for (int i = 2; i <= n; i <<= 1) {
            int j;
                for (j = 0; j + i <= n; j += i) {
                    sort(c + j, c + j + i);
                }
                sort(c + j, c + n);
                if (same(c, b, n)) {
                        mark = true;
                }
            if (mark && (!same(c, b, n))) {
                    puts("Merge Sort");
                    print(c, n);
                    return true;
            }
        
        }
        return false;
}


int main() {
int n;
        scanf("%d",&n);
        for (int i = 0; i < n; ++i) {
                scanf("%d",a + i);
        }
        for (int i = 0; i < n; ++i) {
                scanf("%d", b + i);
        }
        memcpy(c, a, sizeof(a));
        if (!insertion(c, n)) {
                merge(a, n);
        }
        return 0;
}


原题链接: http://www.patest.cn/contests/pat-a-practise/1089

全部评论
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 110; int origin[maxn], tempOri[maxn], changed[maxn]; int n; bool isSame(int a[], int b[]){ for(int i = 0; i < n; i++){ if(a[i] != b[i]) return false; } return true; } void showArray(int a[]){ for(int i = 0; i < n; i++){ printf("%d",a[i]); if(i < n-1) printf(" "); } } bool insertSort(){ bool flag = false; for(int i = 1; i < n; i++){ if(i != 1 && isSame(tempOri, changed)){ flag = true; } int temp = tempOri[i], j = i; while(j > 0 && tempOri[j - 1] > temp){ tempOri[j] = tempOri[j - 1]; j--; } tempOri[j] = temp; if(flag && !isSame(tempOri, changed)) return true; } return false; } void mergeSort(){ bool flag = false; for(int step = 2; step / 2 <= n; step *= 2){ if(step != 2 && isSame(tempOri, changed)){ flag =true; } for(int i = 0; i < n; i += step){ sort(tempOri + i, tempOri + min(step + i, n)); } if(flag){ showArray(tempOri); return; } } } int main(){ scanf("%d", &n); for(int i = 0; i < n; i++){ scanf("%d", &origin[i]); tempOri[i] = origin[i]; } for(int i = 0; i < n; i++){ scanf("%d", &changed[i]); } if(insertSort()){ printf("Insertion Sort\n"); showArray(tempOri); }else{ printf("Merge Sort\n"); for(int i = 0; i < n; i++){ tempOri[i] = origin[i]; } mergeSort(); } return 0; }
点赞 回复 分享
发布于 2017-02-15 23:55

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
昨天 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务