PAT乙级1035 插入与归并 (25 分)

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级1035 插入与归并 (25 分)相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
题目地址

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int>a(105,0),b(105,0),temp;
bool flag;
void insert_sort()//插入排序 
{
	int index=0;
	int i,j,s;
	for(i=1;i<n;i++)
	{
		s=temp[i];
		for(j=i;j>0&&temp[j-1]>s;j--)
		{
			temp[j]=temp[j-1];
		}
		temp[j]=s;
		if(temp==b)
		{
			flag=true;
			break;
		}
	}
	if(flag)
	{
		i++;
		s=b[i];
        if(i<n)
        {
            for(j=i;j>0&&b[j-1]>s;j--)
		    {
			    b[j]=b[j-1];
		    }
		    b[j]=s;
        }
	}
}
void Merge_sort()//归并排序
{
	int i,j;
	for(i=2;i<n;i=i*2)
	{	
		for(j=0;j+i<=n;j+=i)
		{
			sort(a.begin()+j,a.begin()+j+i);
		}
		if(n%i!=0)
		{
			sort(a.begin()+n/i*i,a.begin()+n/i*i+2);
		}
		if(a==b)
		{
			break;
		}
	}
	i=i*2;
	for(j=0;j+i<=n;j+=i)
	{
		sort(b.begin()+j,b.begin()+j+i);
	}
	if(n%i!=0)
	{
		sort(b.begin()+n/i*i,b.begin()+n/i*i+n%i);
	}
} 
int main(void)
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++) cin>>b[i];
	
	temp=a;
	insert_sort();
	
	if(flag) cout<<"Insertion Sort"<<endl;
	else Merge_sort(),cout<<"Merge Sort"<<endl;
	
	for(int i=0;i<n;i++) 
	{
		if(i) cout<<" ";
		cout<<b[i];
	}
	return 0;
}

精简版:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>a(105,0),b(105,0),s;
int n,flag;
void insert_sort()
{
	int i,j,temp;
	for(i=1;i<n;i++)
	{
		temp=a[i];
		for(j=i;j>0&&a[j-1]>temp;j--) a[j]=a[j-1];
		a[j]=temp;
		if(a==b) 
		{
			flag=1; break;
		}
	} 
	if(flag)
	{
		i++;
		if(i<n)
		{
			temp=b[i];
			for(j=i;j>0&&b[j-1]>temp;j--) b[j]=b[j-1];
			b[j]=temp;
		}
	}
}
void merge_sort()
{
	int i;
	for(i=2;i<=n;i=i*2)
	{
		for(int j=0;j+i<n;j+=i) sort(s.begin()+j,s.begin()+j+i);
		if(n%i) sort(s.begin()+n/i*i,s.begin()+n);
		if(s==b) break;
	}
	i=i*2;
	for(int j=0;j+i<n;j+=i) sort(b.begin()+j,b.begin()+j+i);
	if(n%i) sort(b.begin()+n/i*i,b.begin()+n);
}
int main(void)
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++) cin>>b[i];
	s=a;
	insert_sort();
	if(flag) cout<<"Insertion Sort"<<endl;
	else cout<<"Merge Sort"<<endl,merge_sort(); 
	for(int i=0;i<n;i++)
	{
		cout<<b[i];
		if(i+1!=n) cout<<" ";
	}
	return 0;
} 

以上是关于PAT乙级1035 插入与归并 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT排序题---1035 插入与归并 (25分)

PAT-乙级-1035 插入与归并

PAT B1035 插入与归并 (25 分)

PAT 1035. 插入与归并(25)

1035 插入与归并 (25 分)

1035 插入与归并 (25分)