之前采用 找第一个不满足有序的下标,然后从这个往后扫描,如果所有元素都相同,则断定是插入排序。
这次我准备试一下模拟,于是就模拟这个过程,如果找到了相同就返回。
事实上这样过不了测试点2,因为这个例子:
测试用例:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 5 7 8 9 4 6 0
对应输出应该为:
Insertion Sort
1 2 3 4 5 7 8 9 6 0
你的输出为:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
因为有时候多迭代一次仍然是这个样子,而系统默认这是最大次数的排序,所以只能是找规律确定插入排序。(当然你说我继续迭代,直到不同退出,这样也可以,就是麻烦些。)
最后两个测试点如果没过,说明你忽略了一种情况,比如:
1 2 3 7 5 8 6
如果此时要进行个数为4的迭代,你的算法无法进行,因为你没考虑后面那些不够迭代次数的元素,事实上他们也应该参与迭代
附本人AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, index, flag = 0,flag1 = 0;
bool issame(vector<int>V1, vector<int>V2) {
for (int i = 0; i < N; i++) {
if (V1[i] != V2[i])return false;
}
return true;
}
int main() {
scanf("%d", &N);
vector<int>V1(N), V2(N), tmp;
for (int i = 0; i < N; i++)scanf("%d", &V1[i]);
for (int i = 0; i < N; i++) {
scanf("%d", &V2[i]);
if (i > 0 && V2[i] < V2[i - 1] && flag1 == 0) {
flag1 = 1;
index = i;
}
}
int i = index;
for (; i < N; i++) {
if (V2[i] != V1[i]) break;
}
if (i ==N) {
printf("Insertion Sort\n");
sort(V2.begin(), V2.begin() + index + 1);
}
else {
printf("Merge Sort\n");
tmp=V1;
for (int i = 1; i <= N; i *= 2) {
int j = 0;
for (; j + i <= N; j += i) {
sort(tmp.begin() + j, tmp.begin() + j + i);
}
sort(tmp.begin() + j, tmp.end());
if (flag == 1)break;
if (issame(tmp, V2)) flag = 1;
}
V2 = tmp;
}
printf("%d", V2[0]);
for (int i = 1; i < N; i++)printf(" %d", V2[i]);
return 0;
}