pat-1089

发现一个非常重要的逻辑上的错误,以前没注意过

错误案例

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	int a[n],b[n];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<n;i++){
		scanf("%d",&b[i]);
	}
	int _1=0,_2=0,pre=0;
	while(b[pre]<=b[pre+1]&&pre<n-1){
		pre++;//从小到大排列的最后一个位置 
	}
	int j=pre+1;//从下一个位置 
	while(a[j]==b[j]&&j<n){
		j++;
	}
	if(j==n){
		printf("Insertion Sort\n");
		sort(a,a+pre+2);//左闭右开要把pre+1包含进去 
		printf("%d",a[0]);
		for(int i=1;i<n;i++){
			printf(" %d",a[i]);
		}
	}
   else{
   	printf("Merge Sort\n");
	int flag=0;
	for(int step=2;step/2<n;step*=2){
                  //错误在这里,使用了if else语句
		 for(int i=0;i<n;i++){
		 	if(a[i]!=b[i])
		 	break;
		 	else flag=1;
		 }
		for(int i=0;i<n;i+=step){
			sort(a+i,a+min(i+step,n));//sort是左闭右开 
		}
		//此处可以输出每一次排序后的结果
		if(step!=2&&flag==1){
			printf("%d",a[0]);
			for(int i=1;i<n;i++){
				printf(" %d",a[i]);
			}
		break;
		}
		 /*for(int i=0;i<n;i++){
		 	if(a[i]!=b[i])
		 	break;
		 	else flag=1;
		 }*/
	}
  }
  return 0;
	
}

ac       对其修改

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	int a[n],b[n];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=0;i<n;i++){
		scanf("%d",&b[i]);
	}
	int _1=0,_2=0,pre=0;
	while(b[pre]<=b[pre+1]&&pre<n-1){
		pre++;//从小到大排列的最后一个位置 
	}
	int j=pre+1;//从下一个位置 
	while(a[j]==b[j]&&j<n){
		j++;
	}
	if(j==n){
		printf("Insertion Sort\n");
		sort(a,a+pre+2);//左闭右开要把pre+1包含进去 
		printf("%d",a[0]);
		for(int i=1;i<n;i++){
			printf(" %d",a[i]);
		}
	}
   else{
   	printf("Merge Sort\n");
	int flag=0;
	for(int step=2;step/2<n;step*=2){
		 /*for(int i=0;i<n;i++){
		 	if(a[i]!=b[i])
		 	break;
		 	else
		 	flag=1;
		 }*/
		 int i;
		 for( i=0;i<n;i++){
		 	if(a[i]!=b[i])
		 	break;
		 }
		 if(i==n) flag=1;
		for(int i=0;i<n;i+=step){
			sort(a+i,a+min(i+step,n));//sort是左闭右开 
		}
		//此处可以输出每一次排序后的结果
		if(flag==1){
			printf("%d",a[0]);
			for(int i=1;i<n;i++){
				printf(" %d",a[i]);
			}
		break;
		}
		
		 /*for(int i=0;i<n;i++){
		 	if(a[i]!=b[i])
		 	break;
		 	else flag=1;
		 }*/
	}
  }
  return 0;
	
}

 

总结

1.插入排序模拟可以直接sort一块模拟,注意sort函数是左闭右开的sort(+,+)

2.归并排序,step/2<=n是为了全部都合并到一个归并段中,然后  模拟时,注意最后min(,)两个sort时

3.two pointer 先找从小到大的最后一个元素的为置再从下一个位置判断是不是与原数组相等,相等就是插入排序,不相等是归并

非常重要的逻辑错误   if-else 的错用

当想找一个数组与另外一个数组是否相等,并且相等时输出什么,此时要整块来看慎用if -else  

因为在for循环中,前面可能有相等的元素就直接把参数改了,导致即使不相等也输出的情况,所以整个数组相不相等不能参数改变的主动权落在某个元素上,这不是存在性问题,有一个元素相等就改变参数,  要等整个for循环结束后,再看是否到达终止条件,到达说明都相等,没到达说明不相等

整个东西判断相不相等,一定要等整个跑完,再改变参数不能在过程中导致参数改变,此时慎用if-else

英语

 

 

问题

归并的递归不清楚  直插的递归不清楚  非递归形式不熟练

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值