1035. 插入与归并(25)
来源:互联网 发布:尬是什么意思 网络 编辑:程序博客网 时间:2024/05/17 05:53
如题:http://www.patest.cn/contests/pat-b-practise/1035
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入样例1:
103 1 2 8 7 5 9 4 6 01 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort1 2 3 5 7 8 9 4 6 0
输入样例2:
103 1 2 8 7 5 9 4 0 61 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort1 2 3 8 4 5 7 9 0 6
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[105];
int res[105];
int t[105];
int n;
int mout=0;
int insert_sort()
{
int i,j;
memcpy(t,a,sizeof(int)*105);
int out=0;
int flg=0;
for(i=1;i<n;i++)
{
int tmp=t[i];
for(j=i-1;j>=0;j--)
{
if(t[j]>tmp)
t[j+1]=t[j];
else
break;
}
t[j+1]=tmp;
if(out)
{
cout<<"Insertion Sort"<<endl;
for(j=0;j<n;j++)
printf("%d%c",t[j],j==n-1?'\n':' ');
return 1;
}
flg=0;
for(j=0;j<n;j++)
if(t[j]!=res[j])
{
flg=1;
break;
}
if(!flg)
out=1;
}
return 0;
}
void merge(int l,int mid,int r)
{
int i,j;
i=l,j=mid+1;
int m=l;
while(i<=mid&&j<=r)
{
if(a[i]<a[j])
{
t[m++]=a[i];
i++;
}
else
{
t[m++]=a[j];
j++;
}
}
while(i<=mid)
t[m++]=a[i++];
while(j<=r)
t[m++]=a[j++];
for(i=l;i<=r;i++)
a[i]=t[i];
}
void merge_pass(int l,int r,int s)
{
int i,j;
int flg=0;
for(i=l;i+2*s-1<=r;i+=2*s)
{
merge(i,i+s-1,i+2*s-1);
if(!mout)
{
flg=0;
for(j=0;j<n;j++)
{
if(res[j]!=a[j])
{
flg=1;
break;
}
}
if(!flg)
mout=1;
}
}
if(i+s-1<r)
{
merge(i,i+s-1,r);
if(!mout)
{
flg=0;
for(j=0;j<n;j++)
{
if(res[j]!=a[j])
{
flg=1;
break;
}
}
if(!flg)
mout=1;
}
}
}
void merge_sort(int l,int r)
{
int s=1;
while(l+s-1<n)
{
if(mout==1)
mout=2;
merge_pass(l,r,s); //在[l,r]区间内以步长s排序。
if(mout==2)
{
int i;
cout<<"Merge Sort"<<endl;
for(i=0;i<n;i++)
printf("%d%c",a[i],i==n-1?'\n':' ');
return;
}
s*=2;
}
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
cin>>n;
int i;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>res[i];
if(insert_sort()==1)
{
return 0;
}
merge_sort(0,n-1);
return 0;
}
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1035. 插入与归并(25)
- 1030. 完美数列(25)
- 黑马程序员-用点语法,@property关键字和@synthesize关键字优化set和get方法
- 最短路径—Dijkstra算法和Floyd算法
- perl 自定义请求头
- 'libxml/tree.h' file not found
- 1035. 插入与归并(25)
- Summary Ranges(leetcode 228)
- POJ 2155 Matrix
- centos下安装zookeeper
- Andrew Ng Machine Learning 专题【Introduction】
- 训练开始
- 1003. 我要通过!(20)
- javascript方法大收集
- java.lang.UnsupportedClassVersionError