【问题标题】:swap function in quick sort gives wrong output快速排序中的交换功能给出错误的输出
【发布时间】:2017-09-02 20:39:33
【问题描述】:

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

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;
}

我在快速排序算法的分区函数中将数组元素传递给这个函数。

【问题讨论】:

  • 当您说“临时变量”时,您能详细说明一下吗?因为引用不能绑定到临时变量。这将导致未定义的行为,这可能会导致您看到的此类行为。请尝试创建Minimal, Complete, and Verifiable Example 并向我们展示。请花点时间read about how to ask good questions
  • 请提供上下文。你传递什么来得到正确或不正确的结果?
  • 您的交换类型的一个问题是它可能下溢或溢出,这是未定义的行为。如果您需要交换功能,只需使用 std::swap 并相信库实现者知道他们在做什么。
  • 它甚至没有用。交换临时变量更快。

标签: c++ algorithm sorting quicksort


【解决方案1】:

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

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),并且如果在没有优化的情况下编译您的代码,它的运行速度会比通常的交换(使用第三个变量)慢,因为它执行更多的内存操作。此外,此代码可能会导致整数溢出或下溢,这是标准未定义的行为,可能会或可能不会按您的预期工作。如果我们将可读性问题(最重要的事情)添加到此列表中,建议不要使用没有第三个变量的交换

【讨论】:

  • 不幸的是,GCC 和 Clang 都没有将它优化为与普通交换相同的东西,所以它只是更糟。也许他们有一天会这样做..
  • @harold 感谢纠正,将在答案文本中修复
  • 为什么是 &a==&b?它们指向不同的变量。那么它们如何相等呢?
  • @PranaySaraiwala swap 在调用时不应将值设置为 0 以与自身交换值。一些最简单的快速排序实现可能会与自身交换元素。
  • thank you!!! that was really helpful - 考虑接受答案,而不是积累感叹号(请参阅 Terry Pratchett 的主题)。
猜你喜欢
  • 2012-08-17
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2015-06-06
  • 2015-03-13
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多