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
 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void merge(int num[], int low1, int high1, int low2, int high2){
int temp[];
int index = , i = low1, j = low2;
while(i <= high1 && j <= high2){
if(num[i] < num[j])
temp[index++] = num[i++];
else
temp[index++] = num[j++];
}
while(i <= high1)
temp[index++] = num[i++];
while(j <= high2)
temp[index++] = num[j++];
for(int k = ; k < index; k++)
num[low1 + k] = temp[k];
}
int comp(int num1[], int num2[], int len){
for(int i = ; i < len; i++){
if(num1[i] != num2[i])
return ;
}
return ;
}
void mergeSort(int num[], int num2[], int len){
int isSame = , show = ;
for(int step = ; step / <= len; step *= ){
for(int i = ; i < len; i += step){
int mid = i + step / - ;
merge(num, i, mid, mid + , min(i + step - , len - ));
}
isSame = comp(num, num2, len);
if(isSame == ){
show = ;
continue;
}
if(show == ){
printf("Merge Sort\n");
printf("%d", num[]);
for(int i = ; i < len; i++)
printf(" %d", num[i]);
return;
}
}
}
void inser(int num[], int num2[], int len){
int isSame = , show = ;
for(int i = ; i < len; i++){
int temp = num[i];
int j = i - ;
while(j >= && temp < num[j]){
num[j + ] = num[j];
j--;
}
num[j + ] = temp;
isSame = comp(num, num2, len);
if(isSame == ){
show = ;
continue;
}
if(show == ){
printf("Insertion Sort\n");
printf("%d", num[]);
for(int i = ; i < len; i++)
printf(" %d", num[i]);
return;
}
}
}
int main(){
int N, num1[], num1_[], num2[];
scanf("%d", &N);
for(int i = ; i < N; i++){
scanf("%d", &num1[i]);
num1_[i] = num1[i];
}
for(int i = ; i < N; i++){
scanf("%d", &num2[i]);
}
mergeSort(num1, num2, N);
inser(num1_, num2, N);
cin >> N;
return ;
}

总结:

1、归并排序, 合并函数:

void merge(int num[], int low1, int high1, int low2, int high2){
int temp[];
int index = , i = low1, j = low2;
while(i <= high1 && j <= high2){
if(num[i] < num[j])
temp[index++] = num[i++];
else
temp[index++] = num[j++];
}
while(i <= high1)
temp[index++] = num[i++];
while(j <= high2)
temp[index++] = num[j++];
for(int k = ; k < index; k++)
num[low1 + k] = temp[k];
}

非递归写法:

void mergeSort(int num[], int len){
for(int step = ; step <= len; step *= ){ //初始步长为2, 逐步变为4、8、16
for(int i = ; i < len; i += step){ //i + step为每个子区间的首部
int mid = i + step / - ;
merge(num, i, mid, mid + , min(i + step - , len - ));
}
}
}

2、插入排序:将a[0]至a[i]视作有序序列,将a[i + 1]插入a[0]至a[i]中,使之有序。

void inser(int num[], int len){
  for(int i = ; i < len; i++){
int temp = num[i];
int j = i - ;
while(j >= && temp < num[j]){
num[j + ] = num[j];
j--;
}
num[j + ] = temp;
}
}

3、注意,排序用的num数组需要两个,归并排序之后num数组已经改变,不可再用于插入排序。

A1089. Insert or Merge的更多相关文章

  1. A1089 Insert or Merge (25 分)

    一.技术总结 看到是一个two pointers问题,核心是要理解插入排序和归并排序的实现原理,然后判断最后实现 可以知道a数组和b数组怎么样判断是插入排序还是归并排序,因为插入排序是来一个排一个,所 ...

  2. PAT甲级——A1089 Insert or Merge

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

  3. PAT_A1089#Insert or Merge

    Source: PAT A1089 Insert or Merge (25 分) Description: According to Wikipedia: Insertion sort iterate ...

  4. PTA Insert or Merge

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

  5. 60. Insert Interval && Merge Intervals

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  6. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  7. PAT甲级1089. Insert or Merge

    PAT甲级1089. Insert or Merge 题意: 根据维基百科: 插入排序迭代,消耗一个输入元素每次重复,并增加排序的输出列表.每次迭代,插入排序从输入数据中删除一个元素,在排序列表中找到 ...

  8. PAT 1089 Insert or Merge[难]

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

  9. PAT1089. Insert or Merge

    PAT1089. Insert or Merge 题目大意 给定一个初始序列src, 一个排序当中的序列tar, 问排序方式是 Insert Sort, 或者 Merge Sort. 并输出下一次迭代 ...

随机推荐

  1. Object-Oriented(一)创建对象

    自用备忘笔记 前言 虽然可以使用 Object 和对象字面量创建对象,但是如果要创建大量相似的对象又显得麻烦.为解决这个问题,人们开始使用工厂模式的变种. 工厂模式 function person(n ...

  2. width,height为多少px时,A4纸打印时刚好一页?

    计算方式一般的分辨率为XX像素/英寸,其中一英寸为25.4毫米.所以一毫米的像素数就为XX/25.4.现在的工作就是求XX的值了,把XX的值求出来以后,直接用XX/25.4 * 210就得到A4纸的像 ...

  3. Docker容器学习梳理 - 基础知识(1)

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  4. Centos6.5网络配置

    由于项目部署的需要,不得不继续研究Linux,前期看过一些Linux方面的资料,也动手配置过Linux网络配置,但是由于开发项目一般在windows下进行的,用Linux比较少,所以基本上也就忘记以前 ...

  5. 《移山之道》Reading Task

    老师布置的阅读任务虽然是附加的作业,但是对我来说是个很好的学习机会.软件工程主要是对工程的开发进行学习,毕竟在学校老师教了那么多的知识,我们课下做了那么多的练习并没有提高我们做一个工程的能力.一个项目 ...

  6. Alpha冲刺之事后诸葛亮

    组长博客 作业博客 项目Postmortem 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件针对的是福大学子来到食堂会犹豫不决无法决定吃什么 ...

  7. MySQL 单表优化

    一.表字段优化 1.整数类型尽量使用 TINYINT.SMALLINT.MEDIUM_INT 而不是INT,非负数要加上UNSIGNED 2.VARCHAR的长度分配要合理,不要过大 3.时间字段不超 ...

  8. SpringMVC一例 是否需要重定向

    在ASP.NET MVC下: return view("List") 和 return RedirectToAction("List") 百度知道的最佳答案: ...

  9. Java微信二次开发(六)

    Token定时获取 需要导入库:添加log4j(slf4j-api-1.5.10.jar,slf4j-log4j12-1.5.10.jar,log4j-1.2.15.jar,并且在src下添加log4 ...

  10. delphi中怎么获取服务器的时间

    下面是公司的代码,调整成ADO控件,给你参考一下: function GetNetDate: TDateTime; begin with TADOQuery.Create(nil) do begin ...