冒泡排序与异或或一个临时变量
Bubble sort with XOR or a temporary variable
在使用冒泡排序算法对数组进行排序的场景中,这种算法更有效:在嵌套循环中创建临时变量或使用异或操作符:
#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
正如您所看到的,两种优化的片段只涉及四个内存引用,因此两种方法大致相等,但是异或方法涉及三个额外的指令,因此它不可能执行得更好。
不相信我?好吧,那就别相信我的话!我甚至不能确定您的编译器可能能够执行哪些额外的优化。因此,除了运行基准测试或分析代码外,还可以尝试查看编译器为上述代码片段生成的程序集。(当然,在启用所有优化的情况下)相关文章:
- 用C++中的一个变量定义一个常量
- 一个变量的输入值也会保存到另一个变量中
- 将双精度变量设置为另一个变量的值
- 对具有相同方法的不同类使用一个变量
- 为什么一个变量获得与另一个值相同的值
- 尝试在 C++ 中为 ifstream 提供一个变量
- 类中的一个变量显示,但另一个不显示
- 声明一个变量,该变量在 c++ 或 c 中具有值,当程序终止时不会被销毁
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 如何将一个变量用于父类和派生类
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 迭代器或反向器的一个变量
- fstream库,试图创建一个变量名为(c++)的文件
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 如何将一些变量放在一个变量中?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 如何用索引命名一个变量来存储输入 mxArray?