[英]swapping without using 3rd(temporary variable) is giving diff answer in this program can someone tell me why?
当交换部分在第三个变量(临时变量)的帮助下完成时,它可以正常工作,但是当它在不使用临时变量(如 a=a+b; b=ab; a=ab;)的情况下完成时,output 会发生变化
此 quick_sort 程序工作正常,但 output 在交换方法更改时正在更改
#include<stdio.h>
void swap(int *a,int *b){/*
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;*/
int t=*a;
*a=*b;
*b=t;
}
int sort(int a[],int st,int piv){
int i=st-1,j,t;
for(j=st;j<=piv-1;j++){
if(a[j]<=a[piv]){
i++;
swap(&a[j],&a[i]);
}}
swap(&a[i+1],&a[piv]);
return i+1;
}
void quick(int a[],int st,int en){
if(st<en){
int x=sort(a,st,en);
quick(a,st,x-1);
quick(a,x+1,st);
}
}
void main(){
int a[]={11,1,23,22,10,18,0,13},i;
quick(a,0,7);
for(i=0;i<8;i++)
printf("%d ",a[i]);
}
让我们看看您的替代版本的交换!
void swap(int *a,int *b){
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
假设a=x,b=y
,那么我们得到: a=x+y
,然后是b=x+yy=x
和a=x+yx=y
。 这些可以证明您的交换代码是有意义的。 但问题在哪里? 您的推理暗示int* a
独立于int* b
。 如果您尝试调用swap(&a[0],&a[0])
而您的预期行为是让a[0]
保持不变,则不会发生这种情况,因为a
和b
指向完全相同的 memory 位置。
这是它的正确版本:
void swap(int *a,int *b){
if(a==b) return;
*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
编辑:虽然此方法适用于大多数情况,但它可能由于a+b
溢出而失败。 不要在实际代码中使用它,但请随意保留它以了解if(a==b) return;
.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.