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 resulting 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
/*
* 这题给了200ms的时间 n<=100 所以这题即使每排序一趟与中间序列进行比较 时间复杂度也仅为O(n^2) 完全可以
* 还有个O(n)的算法:
1. 插入排序特点为 前面均为有序序列 没排序的与原序列相同
2. 归并排序进行了几趟归并 可通过len=2 到 n/2 进行枚举 直到不满足每一组归并序列都有序的条件时 即可得到当前
进行了几次归并 另外 这题题目好像有点问题 比如 1 2 4 3 中间序列为 1 2 4 3 你根本不知道是进行了2趟还是3趟插入排序@—-@。
*/
#include "iostream"
#include "algorithm"
using namespace std;
void merge(int a[], int temp[], int left, int right, int rightEnd) { /* 合并2个有序的子序列 */
int l = left;
int leftEnd = right - ;
int len = rightEnd - left + ;
while (left <= leftEnd && right <= rightEnd) {
if (a[left] <= a[right]) {
temp[l] = a[left];
left++;
}
else {
temp[l] = a[right];
right++;
}
l++;
}
while (left <= leftEnd)
temp[l++] = a[left++];
while (right <= rightEnd)
temp[l++] = a[right++];
}
/* 一趟2路归并 */
void MergePass(int a[], int temp[], int n, int length) { /* length:当前有序子列的长度 */
int i;
for (i = ; i <= n - * length; i += * length) {
merge(a, temp, i, i + length, i + * length - );
}
if (i + length < n)
merge(a, temp, i, i + length, n - );
else
for (int j = i; j < n; j++)
temp[j] = a[j];
}
int getLen(int b[], int n) { /* 进行一趟归并排序 */
for (int len = ; len <= n / ; len *= ) {
int i;
for (i = ; i <= n - * len; i += * len)
if (!is_sorted(b + i, b + i + * len)) return len;
if (!is_sorted(b + i, b + n)) return len;
}
}
bool judge(int a[],int b[],int n) { /* 判断是不是插入排序 */
int len = ;
int i;
for ( i = ; i < n - ; i++)
if (b[i] > b[i + ]) {
len = i + ;
break;
}
for (i=len; i < n; i++) {
if (a[i] != b[i])
return false;
}
sort(b, b + len + );
return true;
}
void print(int a[], int n) {
for (int i = ; i < n; i++) {
if (i == )
cout << a[i];
else
cout << " " << a[i];
}
cout << endl;
}
int main() {
int a[], b[];
int n;
cin >> n;
for (int i = ; i < n; i++) {
cin >> a[i];
}
for (int i = ; i < n; i++) {
cin >> b[i];
}
if (judge(a, b, n)) {
cout << "Insertion Sort" << endl;
print(b, n);
}
else {
cout << "Merge Sort" << endl;
int* temp = (int *)malloc(n * sizeof(int));
if (temp != NULL) {
MergePass(b, temp, n, getLen(b, n));
print(temp,n);
free(temp);
}
}
}
PAT 1089. Insert or Merge (25)的更多相关文章
- PAT甲级:1089 Insert or Merge (25分)
PAT甲级:1089 Insert or Merge (25分) 题干 According to Wikipedia: Insertion sort iterates, consuming one i ...
- PAT 1089 Insert or Merge[难]
1089 Insert or Merge (25 分) According to Wikipedia: Insertion sort iterates, consuming one input ele ...
- PAT (Advanced Level) 1089. Insert or Merge (25)
简单题.模拟一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector& ...
- 【PAT甲级】1089 Insert or Merge (25 分)(插入排序和归并排序)
题意: 输入一个正整数N(<=100),接着输入两行N个整数,第一行表示初始序列,第二行表示经过一定程度的排序后的序列.输出这个序列是由插入排序或者归并排序得到的,并且下一行输出经过再一次排序操 ...
- 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, ...
- 1089. Insert or Merge (25)-判断插入排序还是归并排序
判断插入排序很好判断,不是的话那就是归并排序了. 由于归并排序区间是2.4.8开始递增的,所以要判断给出的归并排序执行到哪一步,就要k从2开始枚举. 然后再对每个子区间进行一下sort即可. #inc ...
- PAT 1089. Insert or Merge
Insertion sort iterates, consuming one input element each repetition, and growing a sorted output li ...
- 1089 Insert or Merge (25 分)
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
随机推荐
- aircrack-ng on OSX 从零开始之安装
今天在知乎上看到了Evil1m0在知乎上写的一个关于无线网入侵的帖子,激起我也想折腾一下想法.其实这个想法已经由来已久了.如今WIFI遍地都有,这里面的安全隐患我真心觉得太大.实在需要舆论来给大家普及 ...
- android网络优化
Android---优化下载让网络访问更高效(二) ListView异步加载图片实现思路(优化篇) Android之ListView异步加载网络图片(优化缓存机制) android 网络加载图片,对图 ...
- Percona Xtrabackup备份mysql全库及指定数据库(完整备份与增量备份)
原文地址:http://www.tuicool.com/articles/RZRnq2 Xtrabackup简介 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对In ...
- flash中函数的理解
flash 中的函数, 只有在调用时,会分配 数据地址(参数数据,返回数据等)和代码地址. 并运行语句,得到结果(返回数据). 结果(返回数据)赋值后 函数调用结束,释放所有建立的所有空间. ---- ...
- 李洪强漫谈iOS开发[C语言-023]-取余数运算符
- Linux内核spin_lock与spin_lock_irq分析
http://blog.csdn.net/zhanglei4214/article/details/6837697
- session跨域共享解决方案
要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...
- Linux网络地址转换分析
Linux网络地址转换分析 地址转换用来改变源/目的端口,是netfilter的一部分,也是通过hook点上注册相应的结构来工作. Nat注册的hook点和conntrack相同,只是优先级不同,数据 ...
- Linux -- Ubuntu搭建java开发环境
Steps 1 Check to see if your Ubuntu Linux operating system architecture is 32-bit or 64-bit, open up ...
- 利用if else 来计算车费
static void Main(string[] args) { while (true) { double ...