PAT A1089或者B1035

//我去,看来这题没有坑点。。编译错误解决就ac了,还真是不适应 
//要注意插入排序
/*for(int i=1;i<n;i++){
	int j=i,temp=a[i];
	while(j>0&&a[j-1]>temp){
		a[j]=a[j-1];
		j--;
	}
	a[j]=temp;
}
//归并排序
for(int step=2;step<=n;step*=2){//注意小于等于,注意步长没换一次是两两归并 
	//每step个元素作为一组,作归并排序
	for(int i=0;i<n;i+=step){
		int mid=(i+step/2-1);//注意,不管是从0开始还是从1开始,这里都是要减去1的。以step=4为例想一下
		merge(a,i,mid,mid+1,min(i+step-1,n-1));//不管是0开始还是1开始,i+step-1都要减去1。如果是0开始,就是n-1,如果是1开始,就是n 
	} 
}*/ 
//if(a[k]==b[k]) continue;
#include<cstdio>
#include<algorithm>
//先进行插入排序,如果中途发现有吻合,就确定了,并做下一趟。
//如果一直到最后一趟插入排序也没有吻合,就是归并排序。通过递增组内长度来实现 
int a[110],b[110],first[110];
int n,flag=0;
using namespace std;
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&first[i]);
		a[i]=first[i];
	}
	for(int i=0;i<n;i++){
		scanf("%d",&b[i]);
	}
	int i,j,temp;
	
	for(i=1;i<n;i++){
		temp=a[i];
		j=i;
		while(j>0&&a[j-1]>temp){
			a[j]=a[j-1];
			j--;
		}
		a[j]=temp;
		int k,count=0;
		for(k=0;k<n;k++){
			if(a[k]!=b[k]) break;
			//if(a[k]==b[k]) continue;
			//if(a[k]==b[k]) count++;
		}
		if(k==n) {
			flag=1;
			break;
		}//说明是归并排序 
	}
	if(flag==1){
		printf("Insertion Sort\n");
		if(i!=n-1){
			i++;
			j=i;
			temp=a[i];
			while(j>0&&a[j-1]>temp){
				a[j]=a[j-1];
				j--;
			}
			a[j]=temp;
		}
		for(int k=0;k<n;k++){
			printf("%d",a[k]);//这里一开始写成了scanf! 
			if(k!=n-1) printf(" ");
		}
		return 0;
	}
	else printf("Merge Sort\n");
	for(int step=2;step/2<=n;step*=2){
		int k,i; 
		for(int i=0;i<n;i+=step){
			sort(first+i,first+min(i+step,n));
		}
		for(k=0;k<n;k++){
			if(first[k]!=b[k]) break;
		}
		if(k==n){
			step*=2;
			for(i=0;i<n;i+=step){
				sort(first+i,first+min(i+step,n));
			}
			for(i=0;i<n;i++){
				printf("%d",first[i]);
				if(i!=n-1) printf(" ");
				
			}
			return 0;
		}
	}	
	return 0;
} 

你可能感兴趣的:(C++,算法,归并排序,非递归,pat)