PAT——1035. 插入与归并

根据维基百科的定义:

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

归并排序进行如下迭代操作:首先将原始序列看成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

 1 package com.hone.basical;
 2 
 3 import java.util.Arrays;
 4 import java.util.Scanner;
 5 
 6 /**
 7  * 原题目:https://www.patest.cn/contests/pat-b-practise/1035
 8  * 
 9  * @author Xia 思路:首先第一个思路是模拟插入排序以及归并排序然后将排序的过程序列与结果做比较。这个方法整体比较复杂。
10  *         第二个:原数组a,排列一部分的数组b 分析一下插入排序的特点:前面部分是已经排好的序列,后部分和原序列排列一样。
11  *         那么可以先遍历前面的部分一直到(a[i]>a[i+1])为止,再将a[i+1+1]==b[i+1+1]一直比较至最后一个字符
12  *         或者比较到不相等位置。如果j == a.length()-1,则为插入排序,否则为归并排序。 
13  *         (2):找下面一个排序(a)插入排序:直接将b数组的前 i+1 个元素进行排序 (b)归并排序:需要模拟归并排序的过程。
14  *         可以将a数组进行排序,排序结束的标志是,a[]中所有元素的顺序都与b[]中所有元素的顺序相同。(完全模拟归并排序的过程)然后进行一个归并排序即可
15  *         方法:对于多个是否相同的判断,可以用一个flag标识。 
16  */
17 public class basicalLevel1035InsertMerge {
18 
19     public static void main(String[] args) {
20         Scanner s = new Scanner(System.in);
21         int n = s.nextInt();
22         int[] a = new int[n];
23         int[] a1 = new int[n];
24         for (int i = 0; i < n; i++) {
25             a[i] = s.nextInt();
26         }
27         for (int i = 0; i < n; i++) {
28             a1[i] = s.nextInt();
29         }
30         int i, j;
31         for (i = 0; (i < n - 1) && a1[i] < a1[i + 1]; i++);
32         for (j = i + 1; (j < n) && (a1[j] == a[j]); j++);
33         if (j == n) {
34             System.out.println("Insertion Sort");
35             Arrays.sort(a1, 0, i + 2);
36             for (int j2 = 0; j2 < n - 1; j2++) {
37                 System.out.print(a1[j2] + " ");
38             }
39             System.out.println(a1[n - 1]);
40         } else {
41             System.out.println("Merge Sort");
42             int k = 1, flag = 1; // 用1表示两个数不相等
43             while (flag == 1) {
44                 flag = 0;
45                 for (i = 0; i < n; i++) {
46                     if (a[i] != a1[i])
47                         flag = 1;
48                 }
49                 k = k * 2;
50                 for (i = 0; i < n / k; i++)
51                     Arrays.sort(a, i * k, (i + 1) * k);
52                 Arrays.sort(a, n / k * k, n);     //将尾端的元素进行排序
53             }
54             for (int j2 = 0; j2 < n - 1; j2++)
55                 System.out.print(a[j2] + " ");
56             System.out.println(a[n - 1]);
57         }
58     }
59 }


原文地址:https://www.cnblogs.com/xiaxj/p/7991181.html