首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最好的交换算法?

最好的交换算法?
EN

Stack Overflow用户
提问于 2010-03-13 13:22:55
回答 6查看 10K关注 0票数 6

我从我的一个朋友那里听说最好的交换算法是“(a^=b^=a^=b)”,其中a和b是要交换的两个整数。但是当我使用c语言应用它的时候,它导致了崩溃。你们这些优秀的人能解释一下可能的原因吗?请推荐最好的交换算法。谢谢!伙计们,我想知道坠机的原因。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-03-13 13:24:23

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

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

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

票数 10
EN

Stack Overflow用户

发布于 2010-03-13 15:47:18

a^=b^=a^=b;崩溃可能是因为它调用了可怕的未定义行为。它打破的规则是,它修改a两次,而不使用中间的序列点。可以通过插入一些序列点来修复它-例如,使用逗号运算符:

代码语言:javascript
复制
a ^= (b ^= a ^= b, b);`

或者将其分解为多个语句:

代码语言:javascript
复制
b ^= a ^= b; a ^= b;

然而,对于交换变量来说,这通常仍然是一个糟糕的方法-其他几个答案和评论已经充分解释了原因。

票数 10
EN

Stack Overflow用户

发布于 2010-03-13 13:45:56

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2437355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档