#include <iostream>
#include <algorithm>
using namespace std;
int cmp(int a, int b) {
return a < b;
}
int main() {
int n;
cin >> n;
int *a = new int [n];
int *b = new int [n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
int i, j;
for (i = 0; i < n - 1 && b[i] <= b[i + 1]; i++); //判断是否为插入排序 ,前面是正序 ,后面是不变的
for (j = i + 1; a[j] == b[j] && j < n; j++);
if (j == n) {
cout << "Insertion Sort" << endl;
sort(a, a + i + 2, cmp);
} else {
cout << "Merge Sort" << endl;
int k = 1;
int flag = 1;
while(flag) {
flag = 0;
for (i = 0; i < n; i++) {
if (a[i] != b[i])
flag = 1;
}
k = k * 2;
for (i = 0; i < n / k; i++)
sort(a + i * k, a + (i + 1) * k, cmp); //归并排序的方法
sort(a + n / k * k, a + n, cmp); //归并最后的几个数字 有时候数目不够 不成一组
}
}
for (j = 0; j < n - 1; j++) {
cout << a[j] << " ";
}
cout << a[n - 1];
delete [] a;
delete [] b;
return 0;
}
/*
分析:一开始第三个测试点一直不过,
天真的我以为可以模拟一遍归并的过程
然后在过程中判断下一步是什么。。
然而真正的归并算法它是一个递归过程。。
也就是先排左边一半,把左边的完全排列成
正确的顺序之后,再排右边一半的。。而不是
左右两边一起排列的。。后来改了自己的归并部分
判断的代码就过了。。。
*/
PAT basic 1035
最新推荐文章于 2021-07-13 15:02:18 发布