https://pintia.cn/problem-sets/994805260223102976/problems/994805286714327040
一开始对归并排序的理解不到位,导致测试点5、测试点6答案错误。因为每一次归并,末尾没有凑足2的倍数个的数忘记进行排序了。改过之后就AC了。
同时,之前的代码由于盲目追求行数少,用了许多三目运算符,于是在1034中遭到报应,于是以后的代码都是该 if 就 if ,该打括号就打括号。
最后,谢谢男朋友帮我改代码,虽然他很不情愿,也骂了我沙雕,但是还是给我改了,谢谢,我谢谢您了。
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n, k, a, flag1=1, flag2=1;
cin >> n;
int num[n], mid[n];
for(int i=0; i<n; i++){
cin >> num[i];
}
for(int i=0; i<n; i++){
cin >> mid[i];
}
// 找到未排序位置k
for(k=1; k<n && mid[k-1]<=mid[k]; k++);
// 判断未排序部分是否相同
for(int i=k; i<n; i++){
if(mid[i] != num[i]){
flag1 = 0;
break;
}
}
// 如果未排序部分相同,则是插入排序
if(flag1 == 1){
cout << "Insertion Sort" << endl;
sort(mid, mid+k+1);
// 输出
for(int i=0; i<n; i++){
cout << mid[i];
if(i!=n-1)
cout << " ";
}
// 如果未排序部分不相同,则是归并排序
}else{
cout << "Merge Sort" << endl;
// 找到归并的倍数
for(a=2; a<n; a*=2){
// 进行一轮归并
int j;
for(j=0; j<n/a; j++){
sort(num+a*j, num+a*j+a);
}
// 尾巴也要排序,不排就导致测试点5、6错误
sort(num+a*j, num+n);
flag2 = 1;
// 看这轮是否相同
for(int j=0; j<n; j++){
if(num[j]!=mid[j]){
flag2 = 0;
break;
}
}
if(flag2 == 1)
break;
}
// 进行下一轮归并
int j;
for(j=0, a=a*2; j<n/a; j++){
sort(num+a*j, num+a*j+a);
}
// 尾巴也要排序,不排就导致测试点5、6错误
sort(num+a*j, num+n);
// 输出
for(int i=0; i<n; i++){
cout << num[i];
if(i!=n-1)
cout << " ";
}
}
return 0;
}