1089. Insert or Merge (25)-判断插入排序还是归并排序
判断插入排序很好判断,不是的话那就是归并排序了。
由于归并排序区间是2、4、8开始递增的,所以要判断给出的归并排序执行到哪一步,就要k从2开始枚举。
然后再对每个子区间进行一下sort即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> using namespace std; const int maxn=105; int num1[maxn],num2[maxn]; int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&num1[i]); for(int i=0;i<n;i++) scanf("%d",&num2[i]); int p,idx; for(idx=0;num2[idx]<=num2[idx+1];idx++); p=idx+1; for(;num2[p]==num1[p] && p<n;p++); //printf("idx:%d p:%d\n",idx,p); if(p==n){ sort(num2,num2+idx+2); printf("Insertion Sort\n"); printf("%d",num2[0]); for(int i=1;i<n;i++){ printf(" %d",num2[i]); } } else{ int k; bool flag=true; for(k=2;k<=n;k=(k<<1)){ for(int i=0;i<n;i+=k){ for(int j=i;j<i+k-1&&j<n-1;j++){ if(num2[j]>num2[j+1]){ flag=false; break; } } if(!flag) break; } if(!flag) break; } for(int i=0;i<n;i+=k){ if(i+k-1<n){ sort(num2+i,num2+i+k); } else sort(num2+i,num2+n); } printf("Merge Sort\n"); printf("%d",num2[0]); for(int i=1;i<n;i++){ printf(" %d",num2[i]); } } return 0; }