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)的更多相关文章

  1. PAT甲级:1089 Insert or Merge (25分)

    PAT甲级:1089 Insert or Merge (25分) 题干 According to Wikipedia: Insertion sort iterates, consuming one i ...

  2. PAT 1089 Insert or Merge[难]

    1089 Insert or Merge (25 分) According to Wikipedia: Insertion sort iterates, consuming one input ele ...

  3. PAT (Advanced Level) 1089. Insert or Merge (25)

    简单题.模拟一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector& ...

  4. 【PAT甲级】1089 Insert or Merge (25 分)(插入排序和归并排序)

    题意: 输入一个正整数N(<=100),接着输入两行N个整数,第一行表示初始序列,第二行表示经过一定程度的排序后的序列.输出这个序列是由插入排序或者归并排序得到的,并且下一行输出经过再一次排序操 ...

  5. PAT Advanced 1089 Insert or Merge (25) [two pointers]

    题目 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and ...

  6. 1089. Insert or Merge (25)

    题目如下: According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, ...

  7. 1089. Insert or Merge (25)-判断插入排序还是归并排序

    判断插入排序很好判断,不是的话那就是归并排序了. 由于归并排序区间是2.4.8开始递增的,所以要判断给出的归并排序执行到哪一步,就要k从2开始枚举. 然后再对每个子区间进行一下sort即可. #inc ...

  8. PAT 1089. Insert or Merge

    Insertion sort iterates, consuming one input element each repetition, and growing a sorted output li ...

  9. 1089 Insert or Merge (25 分)

    According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...

随机推荐

  1. WindowsPhone客户端第一次审核失败记录

    微软返回失败pdf,其中2.7.2和2.7.3没有通过,原因是: 1. 没有提供隐私策略,所以在提交App要填写的隐私策略url里加了隐私策略的网址链接. 2. 由于使用了定位服务,所以第一次进入应用 ...

  2. UVA 1160 X-Plosives

    题意是一次装入物品,物品由两种元素组成,当遇到即将装入的物品与已经装入的物品形成k个物品,k种元素,跳过该物品的装入.可以将每种元素看成顶点,物品看成一条边.这样问题就转化为利用并查集求环的情况. 算 ...

  3. [转贴]使用CryptoAPI解析X509证书和P12证书

    原文在 http://bbs.pediy.com/archive/index.php?t-97663.html,但是觉得这篇文章非常好,我抄下来作我笔记用 一.解析X509证书 1.从磁盘上的证书文件 ...

  4. SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-007-定义切面的around advice

    一.注解@AspectJ形式 1. package com.springinaction.springidol; import org.aspectj.lang.ProceedingJoinPoint ...

  5. Android OTG支持USB读卡器

    我们知道,三星Android手机将USB读卡器通过OTG线插入Micro USB插口后,插拔读卡器里的SD卡,文件管理器也能够识别卡的插拔:而很多手机的OTG连上USB读卡器也来插拔SD卡,会发现文件 ...

  6. C# Json处理日期和Table

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Ru ...

  7. Application.EnableVisualStyles();

    Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);  Application ...

  8. 坑爹的libxml2 for mingw 编译

    按照官方的readerme.txt说法生成Makefile之后,你会发现编译时候需要创建几个文件夹. 还有就是因为宏定义问题,报错,需要在config.h中加入#define HAVE_STDINT_ ...

  9. IPv6 tutorial 1 Get started now

    https://4sysops.com/archives/ipv6-part-1-get-started-now/ You’ve probably heard the news that the In ...

  10. apache开源项目--HydraBase

    Facebook 在官方博客上宣布推出HBase数据库的升级版——HydraBase, Facebook是HBase的重度用户,Facebook的HBase数据库系统存储着Facebook的很多关键业 ...