1089. Insert or Merge (25)

点击打开链接

2路归并排序:就是把序列分为k组,每组2的整数倍个,每次用sort进行排序

void merge_sort(int a[]{
	//因为是二路归并,所以开始step设置为2,每次倍加
	//注意结束条件是step/2<num
	for(int step=2;step/2<num;step*=2){
		//每组step个数据,进行排序
		for(int i=0;i<num;i+=step){
			sort(a+i,a+min(i+step,num));
		}
	}
}


#include<cstdio>
#include <algorithm>
using namespace std;
char ans[2][20]={"Insertion Sort","Merge Sort"};
int ni[110],nm[110],fin[110],num;
int insert_sort(int a[]){
	int ans=-1;
	int stop=num;
	for(int i=1;i<num;i++){
		int flag=1;
		if(i!=stop){
			int j=i;
			int tmp=a[j];
			if(tmp<a[j-1]){
				while(tmp<a[j-1] && j-1>=0){
					a[j]=a[j-1];
					j--;
				}
				a[j]=tmp;
			}
			for(int j=0;j<=num;j++){
				if(a[j]!=fin[j]){
					flag=0;
					break;
				}
			}
			if(flag==1){
				ans=0;
				stop=i+2;
			}
		}else{
			break;
		}
		
	}
	return ans;
}
<pre name="code" class="cpp">int merge_sort(int a[]){
	int ans = -1;
	int stop=num*2;
	//step为每次排序个数
	for(int step=2;step/2<num;step*=2){
		int flag=1;
		if(step!=stop){
			for(int i=0;i<num;i+=step){
				//min(i+step,num)因为最后一组可能个数不够step个
				sort(a+i,a+min(i+step,num));
			}
			for(int i=0;i<num;i++){
				if(a[i]!=fin[i]){
					flag=0;
					break;
				}
			}
			if(flag==1){
				ans=1;
				stop=step*4;
			}
		}else{
			break;
		}
		
	}
	return ans;
}

int main(){freopen("in.txt","r",stdin);scanf("%d",&num);for(int i=0;i<num;i++){scanf("%d",&ni[i]);nm[i]=ni[i];}for(int i=0;i<num;i++){scanf("%d",&fin[i]);}int a=insert_sort(ni);if(a==-1){a=merge_sort(nm);puts(ans[a]);for(int i=0;i<num-1;i++){printf("%d ",nm[i]);}printf("%d\n",nm[num-1]);}else{puts(ans[a]);for(int i=0;i<num-1;i++){printf("%d ",ni[i]);}printf("%d\n",ni[num-1]);}return 0;}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值