根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确
的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩
下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以
空格分隔。
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试
的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
10<br/>3 1 2 8 7 5 9 4 6 0<br/>1 2 3 7 8 5 9 4 6 0
Insertion Sort<br/>1 2 3 5 7 8 9 4 6 0
import java.util.*; public class Main{ static int swi = 1; public static void main(String [] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = 0; boolean flag = true; int [] arr = new int [n]; int [] sortArr = new int [n]; for(int i = 0; i < n; i++) arr[i] = sc.nextInt(); for(int i = 0; i < n; i++) sortArr[i] = sc.nextInt(); for(int i = 1; i < n; i++){ if(sortArr[i - 1] > sortArr[i]){ k = i; break; } } for(int i = k; i < n; i++){ if(arr[i] != sortArr[i]){ flag = false; break; } } if(flag) insertionSort(sortArr, k); else{ int [] t = new int[arr.length]; for(int i = 1; i < n && swi != 0; i <<= 1, i++,swi++){ for(int j = 0; j < n; j += i + 1){ if(j + i > n) sort(arr,j, n - 1,t); else sort(arr,j, j + i,t); } boolean f = check(arr, sortArr); if(f) swi = -2; } System.out.println("Merge Sort"); for(int i = 0; i < arr.length - 1; i++) System.out.print(arr[i] + " "); System.out.print(arr[sortArr.length - 1]); } } private static boolean check(int[] arr, int[] sortArr) { for(int k = 0 ;k < sortArr.length; k++){ if(arr[k] != sortArr[k])return false; } return true; } private static void sort(int[] arr, int start, int end, int[] temp) { int i = start, j = (start + end) / 2 + 1; int m = (start + end) / 2, n = end; int k = 0; while (i <= m && j <= n) { if (arr[i] <= arr[j]) temp[k++] = arr[i++]; else temp[k++] = arr[j++]; } while (i <= m) temp[k++] = arr[i++]; while (j <= n) temp[k++] = arr[j++]; for (i = 0; i < k; i++) arr[start + i] = temp[i]; } private static void insertionSort(int[] sortArr, int k) { int v = sortArr[k]; int i = k; while(i > 0){ if(sortArr[i - 1] > v) sortArr[i] = sortArr[i - 1]; else break; i--; } sortArr[i] = v; System.out.println("Insertion Sort"); for(i = 0; i < sortArr.length - 1; i++) System.out.print(sortArr[i] + " "); System.out.print(sortArr[sortArr.length - 1]); } }