如何在尽可能保留内存的同时交换两个数组的值?

时间:2011-02-02 05:36:46

标签: arrays algorithm language-agnostic

两个数组要与它们的值互换,我正在寻找方法来不使用第三个数组。怎么可以解决?我看到一些算术方法(如下所示)用于整数,但无法用字符串数组解决我的问题。

int a[350]={350 values};
int b[350]={350 values};
for(int i=0;i<350;i++)
{
    a[i]=a[i]+b[i];
    b[i]=a[i]-b[i];    
    a[i]=a[i]-b[i];
}

7 个答案:

答案 0 :(得分:4)

如果要迭代数组,则不需要新数组;只需一个临时变量即可,每次迭代都可以重复使用。

如果禁止任何新的内存分配,那么只要数据类型是完整的,就可以使用算术或XOR解决方案。

for(int i = 0; i < 350; ++i)
{
    a[i] = a[i] + b[i];
    b[i] = a[i] - b[i];    
    a[i] = a[i] - b[i];
}
// or
for(int i = 0; i < 350; ++i)
{
    a[i] ^= b[i];
    b[i] ^= a[i];
    a[i] ^= b[i];
}

最后,你总是可以交换数组指针!

object[] a;
object[] b;
object[] temp;

temp = a;
a = b;
b = temp;

答案 1 :(得分:2)

为什么要使用任何荒谬的技巧?你不能省去一个int临时的吗?

for(int i=0;i<350;i++)
{
    std::swap(a[i], b[i]);
}

std::swap_ranges(a, a+350, b);

注意:在我的机器上,XOR技巧通常需要两倍于交换使用单个临时变量。

答案 2 :(得分:0)

如果数组是完整的,你可以使用xor技巧:

for(int i = 0; i < 350; ++i) {
    a[i] = a[i] ^ b[i];
    b[i] = a[i] ^ b[i];
    a[i] = a[i] ^ b[i];
}

不需要临时工具

答案 3 :(得分:0)

在C ++中,您可以将bit xor用于指针(我假设字符串为char*wchar_t*)。但实际上我并不认为一个变量对你有害,而且只使用std::swap会更好。

答案 4 :(得分:0)

更好:

for(int i = 0; i < 350; ++i)
{
    a[i] ^= b[i];
    b[i] ^= a[i];
    a[i] ^= b[i];
}

答案 5 :(得分:0)

我猜作者的问题是不使用第三个数组交换数组。所以我认为只使用一个变量就足够了。

int tmp = 0;
for( int i = 0; i < 350; ++i )
{
    tmp = a[i];
    a[i] = b[i];
    b[i] = a[i];
}

为什么要使用某些xor操作?

答案 6 :(得分:0)

你的解决方案不起作用:它实际上说明了一个简单的问题,许多人偶然发现了。

算法的描述通常不会考虑计算机具有的有限内存表示。

特别是在这里,int只能保存这么多位,因此添加可能会导致溢出,这是未定义的行为(在x86上,它包装,但是其他处理器可能会触发硬件异常)。

有两个正确(和简单)的解决方案来交换两个int

  • int tmp = lhs; lhs = rhs; rhs = tmp;,也称为swap
  • lhs ^= rhs; rhs ^= lhs; lhs ^= rhs;,也称为XOR技巧

两者显然适用于阵列。

另一种更高效的解决方案是交换阵列本身。

std::swap(a,b);

注意:如果数组是静态分配的,则不可能直接交换它们,但是你可以完全只使用指向静态分配的数组的指针,从而交换指针

警告:已经有数组引用的对象将不会收到交换通知,在这种情况下,除了交换内容之外别无选择。