PAT甲级1089 Insert or Merge:[C++题解]插入排序、归并排序
文章目录
- 题目分析
- 题目来源
题目分析
来源: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++题解]插入排序、归并排序相关推荐
- PAT甲级1138 Postorder Traversal:[C++题解]前序遍历和中序遍历建树
文章目录 题目分析 题目链接 题目分析 做过前面几道题,发现这道题就是一道模板题,递归建树即可. 还是使用笔者熟悉的hash表来找根,进行优化. 请移步至笔者的另一篇文章:PAT甲级1020 Tree ...
- PAT甲级1121 Damn Single :[C++题解]哈希表、结构体
文章目录 题目分析 题目来源 题目分析 来源:acwing 思路:一对伴侣存入一个结构体中.查询的集合放入哈希表unordered_set<int> S;中.然后遍历每一对伴侣,如果同时存 ...
- PAT甲级1120 Friend Numbers:[C++题解]set去重且有序
文章目录 题目分析 题目链接 题目分析 来源:acwing 对于每个数,统计各位之和,判断有多少个不同的和,然后从小到大输出. 什么数据结构既能去重,又能排序呢? 答案就是set!!! 关于set的介 ...
- PAT甲级1063 Set Similarity:[C++题解]哈希表、去重
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:集合相似度是两个集合A.B都有的数字个数,除以两者不同的数字个数,有以下公式:集合相似度 =NcNt=A∩BA+B−Nc=\frac{ ...
- PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值
文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...
- PAT甲级1154 Vertex Coloring :[C++题解]图论、模拟、结构体存边
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 这题的边不用邻接矩阵.邻接表来存,仅仅用结构体来存即可,结构体正好存边的两个端点,我们只要遍历每条边,判断端点的颜色是否相同即可. ...
- PAT甲级1126 Eulerian Path:[C++题解] 欧拉路径、并查集,测试点4有问题请进来
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 欧拉图: 1)连通 2)度都为偶数 半欧拉图:欧拉路径:2)连通2) 度为奇数的结点有两个,其他度都是偶数 非欧拉图:不是欧拉图和半 ...
- PAT甲级1050 String Subtraction:[C++题解]字符串作差
文章目录 题目分析 朴素算法 hash表优化 题目链接 题目分析 遇到的问题:如何删除下标i的值,我的意思是i后面的需要前移吗?还是有好的解决方法. 笔者想到的是打上标记! string读入一整行的方 ...
- PAT甲级1051 Pop Sequence:[C++题解]模拟栈、判断序列是否是合法的出栈序列
文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 题意:将1~N压栈,判断给定序列是否是合法的出栈序列. 对于序列1~N中的每个值i,先将其压入栈.然后对于它就有两种处理方法:要么压 ...
最新文章
- c++静态变量的生存期
- 海康威视摄像头忘记密码后如何重置
- 【Https(二】】实战 openssl 配置 tomcat
- sql2008安装图解 sql server 2008 R2安装教程
- Cao Le的 Emacs org mode 学习笔记
- 通过iis启动服务,会产生C:/inetpub/logs/logsFile产生大量的日志,定期清理
- 数据可视化--实验4
- 焊武帝再爆肝造CPU,软硬件全自研,可玩游戏,基础器件成本不到1000元
- JavaSE学习笔记-08
- 不定积分、定积分 复习笔记
- linux intel wifi驱动,ubuntu 8.04下面 Intel WIFI link 5100无线网卡驱动安装
- python——基础题
- 海思开发板hi3559移植带opengl的qt并成功运行血泪史
- HIT-ICS Hello‘s P2P
- android如何查看分区信息,【Android】Android如何查看分区情况
- css动画其他div,删除另一个div时的CSS3 Transition动画
- 大华摄像头录像视频,可以使用PotPlayer剪切
- 屡陷丑闻的 Facebook,试图靠 AI Bot 管住员工的嘴
- UTC和GMT时间辨析
- matlab傅里叶变换 绘图