题目难度:两颗星
题目大意:给定两个序列,问第二行的序列是第一列的什么排序?insert还是merge?
题目坑点:没有看算法笔记的解法,直接做,不知道有没有简便的方法。之后看到书的时候再更。
先判断是否是mergesort,因为mergesort特征比较明显,同时判断出当前mergesort的步长,方便下一步的计算,如果不是merge那就是insert咯,insert就找到未被排序的地方,然后插入一下就好了,为了少写插入 ,就都直接偷懒了,用了sort函数。。。可耻可耻。
代码如下:
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
int main(){
int N;
cin>>N;
int num[N];
for(int i=0;i<N;i++)
cin>>num[i];
for(int i=0;i<N;i++)
cin>>num[i];
int isMerge=0;
int step;
for(step=2;step<=N;step*=2){
int s,flag=1;
for(int j=0;j<N;j++){
if(j%step==0){
s=num[j];
}
else{
if(num[j]<s){
flag=0;
break;
}
else{
s=num[j];
}
}
}
if(flag==1){
isMerge=1;
}
else{
break;
}
}
if(isMerge==1){
cout<<"Merge Sort"<<endl;
for(int i=0;i<N;i+=step){
sort(num+i,num+min(N,i+step));
}
}
else{
cout<<"Insertion Sort"<<endl;
int minnum=num[0];
for(int i=1;i<N;i++){
if(num[i]<minnum){
sort(num,num+i+1);
break;
}
else{
minnum=num[i];
}
}
}
for(int i=0;i<N;i++){
cout<<num[i];
if(i!=N-1)
cout<<" ";
}
}