PAT B1035插入排序与归并排序

给出原始数组和中间数组,求是哪种排序方法,并得出下一次迭代的数组。
思路:先判断是不是快速排序,如果不是就是归并排序。
每次排序,先判断是不是目标数组,然后再排序,如果是,之后排序得出的数组就是下一次迭代的数组。
忘记插入排序的模板咋写的了,查了一下天勤。

void InsertSort(int R[],int n){
		inti,j;
		int temp;
		for(int i=1;i<n;i++){
			temp=R[i];
			j=i-1;
			while(j>=0 && temp<R[j]){
				R[j+1]=R[j];
				j--;
			}
			R[j+1]=temp;
		}
	} 

归并排序用算法笔记上的非迭代方法。

注意点:

1.输出之后不能多空格。
2.因为先进行插入排序的判断,数组元素有改变,所以如果插入排序不能得到目标数组,必须还原成原始数组,再进行归并排序。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int O[111],R[111],T[111];
bool isSame(int R[],int T[]){  //确认与目标数组是否相同 
	for(int i=0;i<n;i++){
		if(R[i]!=T[i])
		return false;
	}
	return true;
}
void showArray(int R[]){   //输出数组 
	for(int i=0;i<n;i++){
		printf("%d",R[i]);
		if(i<n-1) printf(" ");
	}
}
bool insertSort(){
	bool flag=false;
	int temp;
	for(int i=1;i<n;i++){ //先确认,再排序,就可直接得出下一轮迭代的数组 
		if(i!=1&&isSame(R,T)){  //当中间的步骤数组跟目标相同,且不是初始序列   
			flag=true;
		}
		temp=R[i]; //下面是插入排序的模板 
		int j=i-1;
		while(j>=0 && temp<R[j]){    //当前面的数组元素比R[i]小的时候,R[i]往前挪,R[j]往后
			R[j+1]=R[j];
			j--;
		}
		R[j+1]=temp;
		if(flag==true) return true;
	}
	return false;   
}
void mergeSort(){
	bool flag=false;
	for(int step=2;step/2<=n;step*=2){
		if(step!=2 && isSame(R,T)){
			flag=true;
		}
		for(int i=0;i<n;i+=step){
			sort(R+i,R+min(i+step,n));
		}
		if(flag==true){
			showArray(R);
			return;
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&O[i]); //输入起始数组
		R[i]=O[i];     //R[i]为备份数组
	}
	for(int i=0;i<n;i++){
		scanf("%d",&T[i]); //T[i]为目标数组
	}
	if(insertSort()){  //如果插入排序可以得到目标数组,则输出插入排序和下一次迭代的数组
		printf("Insertion Sort\n");
		showArray(R);
	}else{
		printf("Merge Sort\n");
		for(int i=0;i<n;i++){
			R[i]=O[i]; //还原备份数组
		}
		mergeSort(); //进行归并排序
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值