这算是比较难的一个题目了。有好几个坑。
首先通过比对第一个不满足有序的数字,确实可以找出来是哪种排序方式。
(找到第一个顺序不对的数以后从这个地方往后遍历,看看和原数组是不是一样即可找排序方式)
But找出排序方式以后,这只是完成了第一步,还有需要按规定方式再迭代一次,这就比较麻烦了。
对于插入排序还好,调用sort函数往后以移动一个数即可。
但是归并排序就麻烦多 了。
坑点如下:
①.下次需要归并的数列,最后不足归并数量(测试点5)
例如:
11
3 1 2 8 7 5 9 4 11 0 6
1 2 3 8 4 5 7 9 0 6 11
②.归并的迭代次数问题(测试点6),不可以通过扫描前面的有次序的数的个数得到迭代次数
例如:
8
1 2 3 8 4 3 1 2
1 2 3 8 3 4 1 2
附AC代码如下:
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int main() {
int N, i, m;
set<int>S;
scanf_s("%d", &N);
vector<int>V(N), T(N);
for (int i = 0; i < N; i++) cin >> V[i];
for (int i = 0; i < N; i++) cin >> T[i];
for (i = 1; i < N; i++) { if (T[i] < T[i - 1])break;}
for (m = i; m < N; m++) {
if (V[m] != T[m])break;
}
if (m >= N) {
printf("Insertion Sort\n");
sort(V.begin(), V.begin() + i + 1);
for (int i = 0; i < N; i++) {
i == 0 ? cout << V[i] : cout << " " << V[i];
}
}
else {
printf("Merge Sort\n");
S.insert(i);
for (int j = i+1; j <= N - 1; j++) if (T[j] < T[j - 1]) { S.insert(j - i); i = j;}
int j = 0;
while (j<=N-1) {
if(j+*S.begin()*2<=N)sort(T.begin()+j, T.begin() + j + *S.begin()*2);
else sort(T.begin() + j, T.end());
j += *S.begin() * 2;
}
for (int i = 0; i < N; i++)i == 0 ? cout << T[i] : cout << " " << T[i];
}
return 0;
}