代码之家  ›  专栏  ›  技术社区  ›  Ashish Yadav

交换的最佳算法?

  •  5
  • Ashish Yadav  · 技术社区  · 14 年前

    我从一个朋友那里听说交换的最好算法是 “(a^=b^=a^=b)” 其中a和b是要交换的两个整数。 但当我用C语言应用这个程序时,它导致了崩溃。 你们这些好人能解释一下可能的原因吗? 请建议交换的最佳算法。 谢谢您!!!!! 伙计们,我想知道撞车的原因。

    5 回复  |  直到 14 年前
        1
  •  9
  •   Yin Zhu    14 年前

    这个交换技巧有时是危险的,我看到一个错误的快速排序程序使用这个交换产生错误的结果。但通常的交换会产生正确的程序。

    在速度方面,如果使用tmp变量,编译器有时会生成更快的代码。

    使用 tmp = a; a = b; b = tmp;

        2
  •  10
  •   caf    14 年前

    a^=b^=a^=b; 可能是因为它引发了恐惧 未定义行为 . 它打破的规则是它修改 a 两次没有中间的序列点。可以通过插入一些序列点(例如,使用逗号运算符)来修复此问题:

    a ^= (b ^= a ^= b, b);`
    

    或者把它分解成多个语句:

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

    然而,它仍然是一种通常不好的变量交换方法——其他一些答案和注释已经充分解释了原因。

        3
  •  3
  •   Yktula    14 年前

    http://en.wikipedia.org/wiki/Swap_(computer_science) .

    使用临时变量会产生更多的开销,但比xor交换算法更稳定,并行计算使其比xor交换更快。

    请参阅的第一个代码示例 http://www.ibm.com/developerworks/linux/library/l-metaprog1.html 使用临时变量进行交换的可靠实现。

        4
  •  0
  •   Jayan    14 年前

    写一段人类读起来更快的代码。并且相信编译器在大多数情况下能够生成更好的代码。做一个分析看看这是不是唯一能提高速度的地方。然后应用上面多次列出的xor解决方案,它可能不适用于所有地方。

        5
  •  -2
  •   Pavunkumar    14 年前

    对数值使用此逻辑:

        int a = 10, b =5 ;
        a = a-b;
        b = b+a ;         // b gets the original value of a
        a = b - a;    // a gets the original value of b
        printf ("value : %d %d \n",a ,b) ;