PAT 1089. Insert or Merge (25) 插入排序+归并排序

来源:互联网 发布:ipad淘宝hd微淘在哪 编辑:程序博客网 时间:2024/05/13 01:27
#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<string.h>#include<cmath>#include<string>using namespace std;///*************************题意:分数运算输出表达式时要为整数+分数形式*************************//************************求解要点:先判断是否为插入若为插入,则求插入的下一步,这个好求关键是如何求归并的下一步先要求出当前归并的段中数量merlen通过样例可知归并并非用递归,而是先22归并,再44归并,再88归并故先让merlen=2,去判断是否都有序,若都有序再去判断是否44有序若44无序,则下一次归并应该为4,再以4做merlen做归并************************//***********************笔记:*********************/#define M 105#define INF 0xfffffint a[M],b[M];int main(){int n,i,j;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++)scanf("%d",&b[i]);for(i=1;i<n;i++)if(b[i]<b[i-1])break;int f=0;int k=i;for(i=k;i<n;i++)if(a[i]!=b[i]){f=1;break;}if(f==0){cout<<"Insertion Sort"<<endl;int c=b[k];for(i=k-1;i>=0;i--){if(b[i]>c)b[i+1]=b[i];else{b[i+1]=c;break;}}if(i<0)b[0]=c;for(i=0;i<n;i++){printf("%d",b[i]);if(i<n-1)cout<<" ";else cout<<endl;}}else{cout<<"Merge Sort"<<endl;int mlen = 1;int l,r;int t;int flag=0;while(!flag){mlen *= 2;l=0;r=mlen;while(r<=n){for(i=l+1;i<r;i++){//当序列内不有序时,说明是这个if(b[i]<b[i-1])flag=1;}if(flag==1)break;else{l=r;r=l+mlen;}}}//cout<<mlen<<endl;l=0;r=mlen;while(l<n){if(r>n)r=n;for(i=l;i<r;i++)for(j=i+1;j<r;j++)if(b[i]>b[j]){t=b[i];b[i]=b[j];b[j]=t;}l=r;r=l+mlen;}for(i=0;i<n;i++){printf("%d",b[i]);if(i<n-1)cout<<" ";else cout<<endl;}}return 0;}

阅读全文
0 0
原创粉丝点击