方法一
利用临时变量来交换
void swap(int *x1,int *x2){
int temp=*x1;
*x2=*x1;
*x1=temp;
}
优点:稳妥
缺点:用了临时变量,占用了空间
方法二
利用加法(或减法)来交换,也可以用乘法来实现,但是除法不行(除法可能会产生小数,小数转整型会导致数值丢失)
void swap(int *x1,int *x2){
*x1=*x1+*x2;
*x2=*x1-*x2;
*x1=*x1-*x2;
}
优点:不用额外空间
缺点:1、会有数值过大造成溢出的风险
2、当x1,x2指向同一内存空间时,返回的 *x1==*x2==0(可以推导下为什么)
方法三
利用位运算(异或^)来交换
void swap(int *x1,int *x2){
*x1=*x1^*x2;
*x2=*x1^*x2;
*x1=*x1^*x2;
}
优点:位运算计算效率高,数值不会溢出,也不占用额外空间
缺点:当x1于x2指向同一内存空间时,返回的 *x1==*x2==0
总结
三种方法一比较,就知道还是方法一最好了,稳妥点没毛病。方法二的问题较多,不建议使用。方法三虽然挺好,但要先判断x1是否等于x2。
PS
可能有人和我一样看着指针*就觉得难受,那么用引用&来做就没有问题了:
void swap(int &x1,int &x2){
int temp=x1;
x1=x2;
x2=temp;
}