根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。

输入样例1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例2:

Merge Sort
1 2 3 8 4 5 7 9 0 6
 package com.hone.basical;

 import java.util.Arrays;
import java.util.Scanner; /**
* 原题目:https://www.patest.cn/contests/pat-b-practise/1035
*
* @author Xia 思路:首先第一个思路是模拟插入排序以及归并排序然后将排序的过程序列与结果做比较。这个方法整体比较复杂。
* 第二个:原数组a,排列一部分的数组b 分析一下插入排序的特点:前面部分是已经排好的序列,后部分和原序列排列一样。
* 那么可以先遍历前面的部分一直到(a[i]>a[i+1])为止,再将a[i+1+1]==b[i+1+1]一直比较至最后一个字符
* 或者比较到不相等位置。如果j == a.length()-1,则为插入排序,否则为归并排序。
* (2):找下面一个排序(a)插入排序:直接将b数组的前 i+1 个元素进行排序 (b)归并排序:需要模拟归并排序的过程。
* 可以将a数组进行排序,排序结束的标志是,a[]中所有元素的顺序都与b[]中所有元素的顺序相同。(完全模拟归并排序的过程)然后进行一个归并排序即可
* 方法:对于多个是否相同的判断,可以用一个flag标识。
*/
public class basicalLevel1035InsertMerge { public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int[] a = new int[n];
int[] a1 = new int[n];
for (int i = 0; i < n; i++) {
a[i] = s.nextInt();
}
for (int i = 0; i < n; i++) {
a1[i] = s.nextInt();
}
int i, j;
for (i = 0; (i < n - 1) && a1[i] < a1[i + 1]; i++);
for (j = i + 1; (j < n) && (a1[j] == a[j]); j++);
if (j == n) {
System.out.println("Insertion Sort");
Arrays.sort(a1, 0, i + 2);
for (int j2 = 0; j2 < n - 1; j2++) {
System.out.print(a1[j2] + " ");
}
System.out.println(a1[n - 1]);
} else {
System.out.println("Merge Sort");
int k = 1, flag = 1; // 用1表示两个数不相等
while (flag == 1) {
flag = 0;
for (i = 0; i < n; i++) {
if (a[i] != a1[i])
flag = 1;
}
k = k * 2;
for (i = 0; i < n / k; i++)
Arrays.sort(a, i * k, (i + 1) * k);
Arrays.sort(a, n / k * k, n); //将尾端的元素进行排序
}
for (int j2 = 0; j2 < n - 1; j2++)
System.out.print(a[j2] + " ");
System.out.println(a[n - 1]);
}
}
}
												

PAT——1035. 插入与归并的更多相关文章

  1. PAT 1035 插入与归并(25)(代码+思路+测试点分析)

    1035 插入与归并(25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到 ...

  2. PAT 1035. 插入与归并(25)

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...

  3. PAT 1035 插入与归并

    https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040 据维基百科的定义: 插入排序是迭代算法,逐一 ...

  4. PAT 1035 插入与归并(25)

    原题:https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040传送门: 根据维基百科的定义: 插入排序 ...

  5. PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)

    PAT (Basic Level) Practise (中文)-1035. 插入与归并(25)   http://www.patest.cn/contests/pat-b-practise/1035 ...

  6. PAT(B) 1035 插入与归并(Java)

    题目链接:1035 插入与归并 (25 point(s)) 参考博客:PAT乙级--1035(插入排序和归并)java实现熊仙森 题目描述 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据, ...

  7. PAT-乙级-1035. 插入与归并(25)

    1035. 插入与归并(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 根据维基百科的定义: 插入排序是迭 ...

  8. P 1035 插入与归并

    转跳点 :

  9. PAT B1035 插入与归并 (25 分)

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...

随机推荐

  1. mysql 中显示 table 的基本信息

    mysql> show table status like 'j_position' \G . row *************************** Name: j_position ...

  2. android中利用HttpURLConnection进行Get、Post和Session读取页面。

    直接上代码,调用的时候要放在线程中. package slj.getsms; import java.io.BufferedReader; import java.io.InputStreamRead ...

  3. Luogu4887 第十四分块(前体)

    sto \(lxl\) orz 考虑莫队,每次移动端点,我们都要询问区间内和当前数字异或有 \(k\) 个 \(1\) 的数字个数 询问 \([l,r]\) 可以再次离线,拆成询问 \([1,l-1] ...

  4. [ZJOI2008]杀蚂蚁 Solution

    题目太长,不在此显示,见洛谷P2586 http://daniu.luogu.org/problem/show?pid=2586 模拟, 那就模拟呗: 各种WA, 然后好久才A了: 一种被社会报复了的 ...

  5. 关于java赋值运算的一个小例子

    直接贴代码,这个也是做题目中遇见的,觉得很好奇,查了一波,然后自己编写代码看了一下,果真如此,哈哈哈...... public class 关于Boolean的赋值运算 { public static ...

  6. 水库抽样Reservoir Sampling(蓄水池问题)

      知识复习 空间亚线性算法:由于大数据算法中涉及到的数据是海量的,数据难以放入内存计算,所以一种常用的处理办法是不对全部数据进行计算,而只向内存里放入小部分数据,仅使用内存中的小部分数据,就可以得到 ...

  7. Linux下vim(文本编译器)的使用

    vim (文本编译器): Vim是从 vi 发展出来的一个文本编辑器. vim的一些命令操作: 插入命令: a 在光标所在字符后插入 A 在光标所在行尾插入 i 在光标所在字符前插入 I 在光标所在行 ...

  8. ScriptManager的使用方法 .(转)

    从这一节开始我将和大家一起学习ASP.NET AJAX的服务器端控件的用法.首先,安装ASPAJAXExtSetup.msi,可以到微软官方网站上去下载.安装之后当你新建项目的时候会多出一个ASP.N ...

  9. Windows Server 2003 动态网站IIS设置(图)

    一.安装IIS     Windows Server 2003 虽说是服务器版本,但在默认情况下并没有安装IIS,要在本地浏览asp,PHP等动态网页,就必须安装IIS.在买系统盘的时候,请注意看一下 ...

  10. Exchange 2010 服务器邮件传输配额设置详解

    在企业的邮件系统管理中,传输邮件的大小配额关系到邮件队列.邮件传输速度以及关系到该附件是否能正常发送,直接关系到用户体验.为此,传输邮件大小的设置,也经常是企业邮件管理员比较迷惑的地方.如下: 1)  ...