原题
1035 插入与归并(25)(25 分)
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数N(<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第1行中输出“Insertion Sort”表示插入排序、或“MergeSort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
我的具体问题:
pat题目测试不给看测试用例,有两个用例一直通不过,看见有人说在牛客网有一样的题目,想去那里看测试用例,结果那里测试全过,新人实在没办法了,有没有大佬帮忙看下
try (Scanner in = new Scanner(System.in)) {
int n = in.nextInt();
int[] A1 = new int[n];
for (int i = 0; i < n; i++) {
A1[i] = in.nextInt();
}
int[] A2 = new int[n];
for (int i = 0; i < n; i++) {
A2[i] = in.nextInt();
}
int orderNums = 1;
int i;
for (i = 1; i < n; i++) {
if (A2[i] > A2[i - 1]) {
orderNums++;
} else
break;
}
boolean IsMerge = false;
for (int j = i; j < n; j++) {
if (A2[j] != A1[j]) {
IsMerge = true;
break;
}
}
if (IsMerge) {
System.out.println("Merge Sort");
int[] tmp = new int[n];
int star = 0;
while (star < n) {
int j = star, k = orderNums + j;
int idx = star;
while (j < orderNums + star && k < star + 2 * orderNums && k < n) {
if (A2[j] > A2[k]) {
tmp[idx++] = A2[k++];
} else {
tmp[idx++] = A2[j++];
}
}
while (j < orderNums + star && j < n)
tmp[idx++] = A2[j++];
while (k < orderNums * 2 + star && k < n)
tmp[idx++] = A2[k++];
for (int l = star; l < star + orderNums * 2 && l < n; l++) {
A2[l] = tmp[l];
}
star += orderNums * 2;
}
for (int n1 = 0; n1 < n; n1++) {
System.out.print(A2[n1]);
if(n1 != n - 1)
System.out.print(" ");
}
} else {
System.out.println("Insertion Sort");
int tmp = A2[orderNums];
int j;
for (j = orderNums; j > 0 && A2[j - 1] > tmp; j--) {
A2[j] = A2[j - 1];
}
A2[j] = tmp;
for (int n1 = 0; n1 < n; n1++) {
System.out.print(A2[n1]);
if(n1 != n - 1)
System.out.print(" ");
}
}
}