#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 0xfffff
int 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;
}
PAT 1089. Insert or Merge (25) 插入排序+归并排序
最新推荐文章于 2021-06-23 10:29:18 发布