2017-04-07 66 views
1

快速排序交换功能。它给出错误的输出。当我使用临时变量时,它会给出正确的输出。 下面是测试仪:快速排序交换功能给出错误输出

void swap(int &a,int &b){ 
    a=a+b; 
    b=a-b; 
    a=a-b; 
} 

这工作虽然罚款:

void swap(int &a,int &b){ 
    int temp=a; 
    a=b; 
    b=a; 
} 

我传递数组元素此功能快速排序算法的功能分区里面。

+5

当你说“临时变量”,你可以详细说明吗?因为引用不能绑定到临时变量。这将导致*未定义的行为*,这可能导致你看到这样的行为。请尝试创建[最小化,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们显示。请花一些时间[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。 –

+0

请提供背景。你通过什么来获得正确或不正确的结果? –

+2

您交换类型的一个问题是它可能下溢或溢出,这是未定义的行为。如果你需要交换功能,只需使用'std :: swap'并相信库实现者知道他们在做什么。 – NathanOliver

回答

7

你没有第三个变量的交换代码看起来没问题。不幸的是,这种算法不能适用于与自身交换的值,例如:

void swap(int &a,int &b){ // &a == &b, the value is 123 
    a=a+b;     // a == b == 246 
    b=a-b;     // a == b == 0 (Oops!) 
    a=a-b;     // a == b == 0 
} 

而且,请注意,是用于交换(std::swap)的标准功能和你的代码,如果没有优化的编译工作慢比通常的交换(与第三个变量),因为它执行更多的内存操作。此外,此代码可能会导致整数溢出或下溢,这是标准未定义的行为,可能会或可能不会像您期望的那样工作。如果我们将可读性问题(最重要的事情)添加到此列表中,则建议是只是不使用没有第三个变量的交换。

+1

不幸的是,GCC和Clang都没有像正常交换一样优化它,所以它只是更糟。也许他们会在某一天做到这一点.. – harold

+0

@harold感谢您的纠正,将修复的答案文本 – alexeykuzmin0

+0

谢谢!那真的有帮助 –