PAT甲级:1089 Insert or Merge (25分)
PAT甲级:1089 Insert or Merge (25分)
题干
According to Wikipedia:
Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.
Merge sort works as follows: Divide the unsorted list into N sublists, each containing 1 element (a list of 1 element is considered sorted). Then repeatedly merge two adjacent sublists to produce new sorted sublists until there is only 1 sublist remaining.
Now given the initial sequence of integers, together with a sequence which is a result of several iterations of some sorting method, can you tell which sorting method we are using?
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤100). Then in the next line, N integers are given as the initial sequence. The last line contains the partially sorted sequence of the N numbers. It is assumed that the target sequence is always ascending. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in the first line either "Insertion Sort" or "Merge Sort" to indicate the method used to obtain the partial result. Then run this method for one more iteration and output in the second line the resuling sequence. It is guaranteed that the answer is unique for each test case. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input 1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
Sample Output 1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
Sample Input 2:
10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6
Sample Output 2:
Merge Sort
1 2 3 8 4 5 7 9 0 6
思路
根据两个排序的特性,我们不难发现:
- 插入排序中,总会是前半段有序,后半段无序。
- 归并排序中,则是一段一段的有序。
由于题目保证唯一解,我们不考虑两者交叉的情况。实际上是两者在很多情况下是无法分清的。
所以首先利用两者的特性,找到第一个次序不对的位置。再继续调查剩下的序列情况,如果与原数列都相同,说明是插入排序。否则一定是归并排序。
插入排序只需要用sort函数处理0到刚刚找到的位置即可。
而归并排序就直接对数据进行排序,等到某一步与给出的第二列数据相同,就再进行一步即可。
code
#include <iostream>
#include <vector>
#include <algorithm>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
void merge(vector<int>& sorted, vector<int>& init){
int k = 1, flag = 1;
while(flag){
flag = 0;
int i;
if(sorted != init) flag = 1;
k *= 2;
for(i = 0; i + k < init.size(); i += k) sort(init.begin() + i, init.begin() + i + k);
sort(init.begin() + i, init.end());
}
}
int main(int argc, char** argv) {
int n = 0, temp_split = 0;
scanf("%d", &n);
vector<int> init(n), sorted(n);
for(int i = 0; i < n; i++) scanf("%d", &init[i]);
for(int i = 0; i < n; i++) scanf("%d", &sorted[i]);
for(int i = 1; i < n; i++){
if(sorted[i] < sorted[i-1]){
temp_split = i;
break;
}
}
for(int i = temp_split; i < n; i++){
if(init[i] != sorted[i]){
printf("Merge Sort\n");
merge(sorted, init);
for(auto it = init.begin(); it != init.end(); it++){
if(it != init.begin()) printf(" ");
printf("%d", *it);
}
return 0;
}
}
printf("Insertion Sort\n");
sort(sorted.begin(), sorted.begin() + temp_split + 1);
for(auto it = sorted.begin(); it != sorted.end(); it++){
if(it != sorted.begin()) printf(" ");
printf("%d", *it);
}
return 0;
}
PAT甲级:1089 Insert or Merge (25分)的更多相关文章
- PAT甲级1089. Insert or Merge
PAT甲级1089. Insert or Merge 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.每次迭代,插入排序从输入数据中删除一个元素,在排序列表中找到 ...
- 【PAT甲级】1089 Insert or Merge (25 分)(插入排序和归并排序)
题意: 输入一个正整数N(<=100),接着输入两行N个整数,第一行表示初始序列,第二行表示经过一定程度的排序后的序列.输出这个序列是由插入排序或者归并排序得到的,并且下一行输出经过再一次排序操 ...
- 1089 Insert or Merge (25 分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- PAT Advanced 1089 Insert or Merge (25) [two pointers]
题目 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and ...
- 1089 Insert or Merge (25分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- PTA 09-排序2 Insert or Merge (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/675 5-13 Insert or Merge (25分) According to ...
- PAT 甲级 1083 List Grades (25 分)
1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...
- PAT 甲级 1040 Longest Symmetric String (25 分)(字符串最长对称字串,遍历)
1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the ...
- PAT甲级——1130 Infix Expression (25 分)
1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...
随机推荐
- String类对象相加时做了什么
我们都知道java中的加号操作符除了加法.表示正数之外,还可以用作字符串的连接.初学java时,你很可能会碰到类似下面的题目: 以下这段代码产生了几个String对象: String str1 = & ...
- 用Redis实现签到功能
一.场景 在很多时候我们会遇到用户签到的场景,每天用户进入应用时,需要获取用户当天的签到状态,如果没签到,用户可以进行签到,并且得到相关的奖励.我们可能需要每天的签到情况,必要的时候可能还需要统计一下 ...
- th:insert、th:replace、th:include抽取和引用页面公共片段、传参等
一.抽取公共片段 th:fragment 给片段命名 将公共片段抽取出来,并在顶级标签内使用th:fragment给该片段命名. 例如:将公共片段抽取出来放到comment/bar.html中: & ...
- 【VBA】延时函数
延时函数(单位秒),例如延时0.5秒 1 Sub 延时() 2 delay (0.5) 3 Debug.Print "延时0.5秒" 4 End Sub 5 6 Sub delay ...
- MySQL的自增ID用完了,怎么办?
既然这块知识点不清楚,那回头就自己动手实践下. 首先,创建一个最简单的表,只包含一个自增id,并插入一条数据. create table t0(id int unsigned auto_increme ...
- MySQL 最佳实践 —— 高效插入数据
当你需要在 MySQL 数据库中批量插入数百万条数据时,你就会意识到,逐条发送 INSERT 语句并不是一个可行的方法. MySQL 文档中有些值得一读的 INSERT 优化技巧. 在这篇文章里,我将 ...
- Linux中重要目录详解
Linux重要目录详解 / 根目录,第一层目录,所有其他目录的根,一般根目录下只存放目录.包括:/bin, /boot, /dev, /etc, /home, /lib, /mnt, /opt, /p ...
- 数据备份[APIO/CTSC 2007]题解
题目描述 你在一家IT公司为大型写字楼或办公楼的计算机数据做备份. 然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣. 已知办公楼 ...
- Samba常见漏洞利用
Samba简介 Samba是linux和unix系统上实现smb协议的一个免费软件,由服务器及客户端程序构成,Samba是面向Linux和Unix环境的Windows互操作性套件.它适用于在可能包括L ...
- 搭建Nexus3私服(含使用说明,支持CentOS、Windows)
官方文档 Nexus仓库介绍(支持maven.yum.docker私服等) 仓库分为三种: proxy:是远程仓库的代理.比如说在nexus中配置了一个central repository的proxy ...