Swap操作是我们经常用到的一种操作。就是将两个元素的值互换。
常见的有两种写法(要交换的是x和y两个整数):
1. 添加两个临时变量分别赋两个元素的值,然后交叉赋值回去。
int a=x,b=y;
x=b,y=a;
- 观察到用方法一时,y的值赋给x后,y原来的值就无意义了,所以只需要添加一个临时变量。
int tmp;
tmp=x,x=y,y=tmp;
方法二是我们最常用的方法。但是可不可以不添加临时变量呢?答案是肯定的。
3. 位运算异或。异或具有可逆性。
设x=a xor b,则
a=x xor b,b=x xor a
那么假定我们要交换A和B。
若变量A=a,B=b
A←A xor B,即A←x
B←A xor B,即B←x xor b=a
A←A xor B,即A←x xor a=b
至此,A=b,B=a
写成代码是这样。
x^=y,y^=x,x^=y;
但这个方法有一个细节,交换的元素不能是同一个。
为什么会出现这种情况呢?
比如有以下代码:
int a[105];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i]^=a[j],a[j]^=a[i],a[i]^=a[j];
当i=j时,a[i] xor a[j]=0。而此时a[i]和a[j]是同一个变量,修改a[i]同时修改a[j],于是a[i]←0 ,就GG了。