使用xor或temp进行冒泡排序

时间:2016-10-07 21:55:48

标签: c++ bubble-sort

在使用冒泡排序算法对数组进行排序的情况下,这种方法在嵌套循环内或使用xor运算符创建临时变量更有效:

#include <iostream>

int main()
{  
    int array[5] = {7, 2, 5, 3, 4};

    /*1: using temporary variable

    for(int i(0); i < 5; i++)
    {
        for(int j(i + 1); j < 5; j++)
        {
            if(array[i] > array[j])
            {
                int tmp  = array[i];
                array[i] = array[j];
                array[j] = tmp;
            }
        }
    }
    */

    //2: using xor ^ swapper
    for(int i = 0; i < 5; i++)
    {
        for(int j(i + 1); j < 5; j++)
        {
            if(array[i] > array[j])
            {
                array[i] ^= array[j];
                array[j] ^= array[i];
                array[i] ^= array[j];
            }
        }
    }


    for( i = 0; i < 5; i++)
        std::cout << array[i] << ", ";

    std::cout << std::endl;
    return 0;
}

我只想知道哪种方法更快更强大,知道这两种方法都能正常工作。

1 个答案:

答案 0 :(得分:1)

正如其他人已经指出的那样,唯一可以确定的方法就是衡量它。

&#34;如何衡量?&#34;如果这样的问题是关于stackoverflow的话题,那本来就是一个完全不同的问题的主题。但它不是。

Google是你的朋友。谷歌一下。寻找关键字,例如&#34; benchmark&#34;或&#34;个人资料&#34;和&#34; C ++&#34;也许是您正在使用的IDE的名称。

除此之外,我可以通过检查说明书给你一些非常好的指示,说明哪一个会更快。

指令序列

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

转换为以下未经优化的说明:

  load  register from a            ;memory reference
  xor   register with b            ;memory reference
  store register to a              ;memory reference
  load  register from b            ;memory reference
  xor   register with a            ;memory reference
  store register to b              ;memory reference
  load  register from a            ;memory reference
  xor   register with b            ;memory reference
  store register to a              ;memory reference

可能如下优化:

  load  register1 from a           ;memory reference
  load  register2 from b           ;memory reference
  xor register1 with register2
  xor register2 with register1
  xor register1 with register2
  store register1 to a             ;memory reference
  store register2 to b             ;memory reference

指令序列

  int tmp  = a;
  a = b;
  b = tmp;

转换为以下未经优化的说明:

  load  register from a            ;memory reference
  store register to tmp            ;memory reference
  load  register from b            ;memory reference
  store register to a              ;memory reference
  load  register from tmp          ;memory reference
  store register to b              ;memory reference

可能如下优化:

  load register1 from a            ;memory reference
  load register2 from b            ;memory reference
  store register1 to b             ;memory reference
  store register2 to a             ;memory reference

正如您所看到的,两个优化的片段只涉及四个内存引用,因此这两种方法大致相同,但XOR方法涉及3个额外的指令,因此它不可能表现得更好。

不相信我?那么,不要接受我的话!我甚至无法确定您的编译器可以执行哪些其他优化。因此,除了运行基准测试或分析代码之外,还要尝试查看编译器为上面的代码片段生成的程序集。 (当然,启用了所有优化。)