import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { static String line; static int N; static int[] test1; static int[] test2; static int[] check; public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); line = in.readLine(); N = Integer.parseInt(line); line = in.readLine(); String[] string = line.split(" "); test1 = new int[N]; test2 = new int[N]; check = new int[N]; for (int i = 0; i < N; i++) { test1[i] = Integer.parseInt(string[i]); } for (int i = 0; i < N; i++) { test2[i] = Integer.parseInt(string[i]); } line = in.readLine(); string = line.split(" "); for (int i = 0; i < N; i++) { check[i] = Integer.parseInt(string[i]); } Merge_sort(test1, N); Insert_sort(test2, N); } public static void ouput(int[] n){ for (int i = 0; i < N - 1; i++) { System.out.print(n[i]); System.out.print(" "); } System.out.print(n[N - 1]); } static boolean isEqual(int a[], int b[], int n) { for(int i=0; i<n; i++) if(a[i] != b[i]) return false; return true; } static void Insert_sort(int[] A, int N) { boolean flag=false; for (int i = 1; i < N; i++) { int temp = A[i]; int j; for (j = i; j > 0 && A[j - 1] > temp; j--) { A[j] = A[j - 1]; } A[j] = temp; if(flag==true){ System.out.println("Insertion Sort"); ouput(A); break; } if(isEqual(A,check,N)){ flag=true; } if(flag==true&&i==(N-1)){ System.out.println("Insertion Sort"); ouput(A); break; } } } static void Merge_sort(int[] A, int N) { boolean flag=false; int length = 1; int[] TmpA = new int[N]; while (length < N) { Merge_pass(A, TmpA, N, length); if(flag==true){ System.out.println("Merge Sort"); ouput(A); break; } if(isEqual(A,check,N)){ flag=true; } length *= 2; Merge_pass(TmpA, A, N, length); if(flag==true){ System.out.println("Merge Sort"); ouput(A); break; } if(isEqual(A,check,N)){ flag=true; } length *= 2; if(flag==true&&length>N){ System.out.println("Merge Sort"); ouput(A); break; } } } static void Merge_pass(int[] A, int[] TmpA, int N, int length) {// length当前有序子列的长度 int i; for (i = 0; i <= N - 2 * length; i += 2 * length) { Merge(A, TmpA, i, i + length, i + 2 * length - 1); } if (i + length < N) Merge(A, TmpA, i, i + length, N - 1); else for (int j = i; j < N; j++) TmpA[j] = A[j]; } /** * * @param A * @param L * 左边起始位置 * @param R * 右边起始位置 * @param RightEnd * 右边终点位置 * @return */ static void Merge(int[] A, int[] TmpA, int L, int R, int RightEnd) { int LeftEnd = R - 1;// 左边终点位置。假设左右两列挨着 int Tmp = L;// 存放结果的数组的初始位置 int NumElements = RightEnd - L + 1;// 元素总数 while (L <= LeftEnd && R <= RightEnd) { if (A[L] < A[R]) TmpA[Tmp++] = A[L++]; else TmpA[Tmp++] = A[R++]; } while (L <= LeftEnd) {// 直接复制左边剩下的 TmpA[Tmp++] = A[L++]; } while (R <= RightEnd) {// 直接复制右边剩下的 TmpA[Tmp++] = A[R++]; } for (int i = 0; i < NumElements; i++, RightEnd--) { A[RightEnd] = TmpA[RightEnd]; } } }