交换到位

时间:2010-04-21 04:01:36

标签: sorting

如何在不使用任何额外空间的情况下在内部交换两个号码?

4 个答案:

答案 0 :(得分:5)

您可以使用XOR运算符执行此操作:

if( x != y) { // this check is very important.

  x ^= y;
  y ^= x;
  x ^= y;
}

修改

如果没有额外检查,上述逻辑无法将数字与自身交换。 例如:

int x = 10;

如果我将上述逻辑应用于自己交换x,而不检查我最终得到x=0,这是不正确的。

类似地,如果我在没有检查函数的情况下放入逻辑并调用函数来交换对同一变量的两个引用,它就会失败。

答案 1 :(得分:3)

xor技巧是标准答案:

int x, y;
x ^= y;
y ^= x;
x ^= y;
但是,xoring不仅仅是使用临时值,而且如果x和y是相同的位置则会失败

答案 2 :(得分:3)

如果您有 2个变量a和b :(每个变量占用自己的内存地址)

a = a xor b
b = a xor b
a = a xor b


此问题还有其他一些变化,但如果出现溢出则会失败:

A = A + B
B = A-B
a = a-b

α= A * B
B = A / B
a = a / b

如果您的自定义类型具有有意义的+和 - 运算符,则加号和减号变量可能有效。


注意:为避免混淆,如果您只有1个变量,以及2个引用或指针,则上述所有操作都将失败。应该进行检查以避免这种情况。

与许多人说的不同,如果你有两个不同的数字并不重要。重要的是你有2个不同的变量,其中数字存在于2个不同的内存地址中。

即。这完全有效:

int a = 3;
int b = 3;

a = a ^ b;
b = a ^ b;
a = a ^ b;

assert(a == b);
assert(a == 3);

答案 3 :(得分:0)

由于没有提到任何语言,所以在Python中:

y, x = x, y