文章目录

  • 题目分析
  • 题目来源

题目分析



来源:acwing

分析:

ac代码
由于本题答案唯一,所以如果是插入排序,就不是归并排序。而且判断插入排序比较简单,所以本题直接判断是否是插入排序即可!!

如何判断是插入排序?

插入排序:前部分有序,后部分等于原序列。所以从前往后扫描到第一个未排好序的数,其后面的数是否和原序列相等即可。

插入排序的下一次排序怎么做?

插入排序下一次用到未排序的第一个数。所以可以直接使用sort函数。sort(b,b+k+2)k表示有序的最后一个数的下标;k+1表示未排序的第一个数的下标,由于sort函数的参数是左闭右开,所以需要用到k+2.

归并排序的下一轮呢?

归并排序的过程:第一轮将相邻的2个(21)(2^1)(21)元素排序;第二轮将相邻的4个(22)(2^2)(22)排序;第三轮将相邻的8个(23)(2^3)(23)排序;……可以使用sort函数排序第i个数到i+len个数。for(int i =0; i<n ;i+= len) sort(a+i,a+min(i+len,n));这里之所以使用min(i+len,n),是因为i+len可能会越界,而min就保证整个序列可以参与到排序中,不会出现后面剩下的不是len的整数倍的数据无法参与排序的情况。

模拟归并排序的过程:

      int k =1;while(true){bool match = check(); //判断第k轮归并排序是否是输入给定的序列int len = 1 << k; //归并排序的间距for(int i =0; i<n ;i+= len)  //该for循环是精髓!!!sort(a+i,a+min(i+len,n));if(match) break;k++;}

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 110;int n;
int a[N],b[N]; //用于归并排序,判断两个序列是否相等
//这里归并a数组,和b数组做比较
bool check(){for(int i= 0; i<n; i++)if(a[i] != b[i]) return false;return true;
}int main(){cin >> n;for(int i = 0; i< n;i ++) cin >> a[i];for(int i =0; i<n; i++) cin>> b[i];int k = 0;//k是有序的最后1个元素while(b[k+1]>= b[k]) k++;bool match = true;for(int i = k+1;i<n; i++){if(a[i] != b[i]){match = false;break;}}// 插入排序if(match) {cout<<"Insertion Sort"<<endl;sort(b,b+k+2); //插入排序下一轮就是:未排好的第一个参与排序[0~k+1]是我们要排序的cout<<b[0];for(int i =1;i<n;i ++) cout<<" "<<b[i];}//归并排序else {cout<<"Merge Sort"<<endl;k = 1;while(true){match = check();  //判断是否是输入给的本轮排序bint len = 1 <<k; //2^k次方,用于归并排序的长度for(int i=0; i<n ;i+= len)sort(a+i,a+min(i+len,n));if(match) break;k++; //归并长度++}cout<<a[0];for(int i =1; i<n; i++) cout<<' '<<a[i];}}

题目来源

PAT甲级1089 Insert or Merge
https://www.acwing.com/problem/content/1581/

PAT甲级1089 Insert or Merge:[C++题解]插入排序、归并排序相关推荐

  1. PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树

    文章目录 题目分析 题目链接 题目分析 做过前面几道题,发现这道题就是一道模板题,递归建树即可. 还是使用笔者熟悉的hash表来找根,进行优化. 请移步至笔者的另一篇文章:PAT甲级1020 Tree ...

  2. PAT甲级1121 Damn Single :[C++题解]哈希表、结构体

    文章目录 题目分析 题目来源 题目分析 来源:acwing 思路:一对伴侣存入一个结构体中.查询的集合放入哈希表unordered_set<int> S;中.然后遍历每一对伴侣,如果同时存 ...

  3. PAT甲级1120 Friend Numbers:[C++题解]set去重且有序

    文章目录 题目分析 题目链接 题目分析 来源:acwing 对于每个数,统计各位之和,判断有多少个不同的和,然后从小到大输出. 什么数据结构既能去重,又能排序呢? 答案就是set!!! 关于set的介 ...

  4. PAT甲级1063 Set Similarity:[C++题解]哈希表、去重

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:集合相似度是两个集合A.B都有的数字个数,除以两者不同的数字个数,有以下公式:集合相似度 =NcNt=A∩BA+B−Nc=\frac{ ...

  5. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值

    文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...

  6. PAT甲级1154 Vertex Coloring :[C++题解]图论、模拟、结构体存边

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 这题的边不用邻接矩阵.邻接表来存,仅仅用结构体来存即可,结构体正好存边的两个端点,我们只要遍历每条边,判断端点的颜色是否相同即可. ...

  7. PAT甲级1126 Eulerian Path:[C++题解] 欧拉路径、并查集,测试点4有问题请进来

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 欧拉图: 1)连通 2)度都为偶数 半欧拉图:欧拉路径:2)连通2) 度为奇数的结点有两个,其他度都是偶数 非欧拉图:不是欧拉图和半 ...

  8. PAT甲级1050 String Subtraction:[C++题解]字符串作差

    文章目录 题目分析 朴素算法 hash表优化 题目链接 题目分析 遇到的问题:如何删除下标i的值,我的意思是i后面的需要前移吗?还是有好的解决方法. 笔者想到的是打上标记! string读入一整行的方 ...

  9. PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 题意:将1~N压栈,判断给定序列是否是合法的出栈序列. 对于序列1~N中的每个值i,先将其压入栈.然后对于它就有两种处理方法:要么压 ...

最新文章

  1. c++静态变量的生存期
  2. 海康威视摄像头忘记密码后如何重置
  3. 【Https(二】】实战 openssl 配置 tomcat
  4. sql2008安装图解 sql server 2008 R2安装教程
  5. Cao Le的 Emacs org mode 学习笔记
  6. 通过iis启动服务,会产生C:/inetpub/logs/logsFile产生大量的日志,定期清理
  7. 数据可视化--实验4
  8. 焊武帝再爆肝造CPU,软硬件全自研,可玩游戏,基础器件成本不到1000元
  9. JavaSE学习笔记-08
  10. 不定积分、定积分 复习笔记
  11. linux intel wifi驱动,ubuntu 8.04下面 Intel WIFI link 5100无线网卡驱动安装
  12. python——基础题
  13. 海思开发板hi3559移植带opengl的qt并成功运行血泪史
  14. HIT-ICS Hello‘s P2P
  15. android如何查看分区信息,【Android】Android如何查看分区情况
  16. css动画其他div,删除另一个div时的CSS3 Transition动画
  17. 大华摄像头录像视频,可以使用PotPlayer剪切
  18. 屡陷丑闻的 Facebook,试图靠 AI Bot 管住员工的嘴
  19. UTC和GMT时间辨析
  20. matlab傅里叶变换 绘图

热门文章

  1. mysql-事务隔离级别
  2. Linux 新增一个用户命令 adduser
  3. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
  4. shell 水平测试
  5. python制作猜拳游戏代码_python实现猜拳游戏项目
  6. 【数理知识】《矩阵论》方保镕老师-第3章-矩阵的分解
  7. 3.1 调试处理-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  8. 2.1 0/1分类问题-机器学习笔记-斯坦福吴恩达教授
  9. 关于IC工程师的VIM实际工作技巧
  10. 延时求和波束形成的MATLAB仿真