思路:
这个题有两问。首先要判断是插入排序还是归并排序,那么这个是比较简单的,找到前半段有序序列,判断后半段是否和原序列相同,若相同,则为插入排序,否则为归并排序。(这里也需要对插入排序和归并排序有一定了解)。
第二个问题就是进行下一轮排序,其实就是要找出目前进行到哪一轮了,插入排序很容易,在判断阶段就能找到,有序的前半段就是进行到的位置(因为题目保证答案唯一,如果不唯一,那么这个说法是不对的)。
如果是归并排序,那么我们可以用另一种思路来考虑,我们可以用一个count来记录目前有序的子序列长度,然后每次count*=2来判断;我们也可以就模拟一次归并排序,然后比较每一轮之后是否与输入序列相同。
PS:记得是否有序的判定方式是a[i]<=a[i+1]; 不要忘记了等于。
代码:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int n;
int a[102], b[102];
int i, j, flag, e;
cin >> n;
for (i = 0; i < n; i++) cin >> a[i];
for (i = 0; i < n; i++) cin >> b[i];
i = 0;
while (i < n - 1 && b[i] <= b[i + 1]) i++;
i++; j = i;
while (i < n && a[i] == b[i]) i++;
if (i == n)
{
cout << "Insertion Sort\n";
sort(a, a + j + 1);
}
else
{
cout << "Merge Sort\n";
e = 1;
flag = 1;
while (flag)
{
flag = 0;
for (i = 0; i < n; i++){
if (a[i] != b[i])
flag = 1;
}
e = e * 2;
for (i = 0; i < n / e; i++)
sort(a + i*e, a + i*e + e);
sort(a + e*(n / e), a + n);
}
}
for (i = 0; i < n - 1; i++)
cout << a[i] << " ";
cout << a[n - 1] << endl;
//while (1)
//{ }
return 0;
}