冒泡排序与异或或一个临时变量

Bubble sort with XOR or a temporary variable

本文关键字:一个 变量 冒泡排序      更新时间:2023-10-16

在使用冒泡排序算法对数组进行排序的场景中,这种算法更有效:在嵌套循环中创建临时变量或使用异或操作符:

#include <iostream>
int main()
{
    int array[5] = {7, 2, 5, 3, 4};
    /* 1: using a 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 the 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;
}

我只想知道哪一个更快更强大,知道这两种方法工作得很好

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

"如何衡量?"如果这样的问题是Stack Overflow的主题,那么它将是一个完全不同的问题的主题。但它不是。

谷歌是你的朋友。谷歌它。查找关键字,如"基准";或";profile"加上" c++ "或者您正在使用的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

正如您所看到的,两种优化的片段只涉及四个内存引用,因此两种方法大致相等,但是异或方法涉及三个额外的指令,因此它不可能执行得更好。

不相信我?好吧,那就别相信我的话!我甚至不能确定您的编译器可能能够执行哪些额外的优化。因此,除了运行基准测试或分析代码外,还可以尝试查看编译器为上述代码片段生成的程序集。(当然,在启用所有优化的情况下)