发现一个非常重要的逻辑上的错误,以前没注意过
错误案例
#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
英语
问题
归并的递归不清楚 直插的递归不清楚 非递归形式不熟练