C++中几种数据交换方法的效率对比
2014-05-26 21:09
232 查看
两个数据交换在编程中很常用,比如排序算法中就经常要用到,下面介绍常用的三种方法,并对它们的效率作出对比,以便在大量用到交换的程序中提高效率。
假设要交换的两个数据为data_1和data_2
第一种方法,使用一个临时temp,代码如下:
第三种方法是使用异或运算符,代码如下:
下面进行效率测试,对每种方法,进行大数量的操作,然后比较执行时间,代码如下:
运行结果:
第一种方法:平均运行时间334毫秒
第二种方法:平均运行时间879毫秒
第三种方法:平均运行时间799毫秒
结果显示,第一种方法效率最高,虽然第一种方法占据一个额外的内存空间,但是交换的三行代码实现的都是赋值操作,相对后两种的加减和异或要快很多。所以,当交换量大时,推荐用第一种方法,速度快,而且最容易理解。
假设要交换的两个数据为data_1和data_2
第一种方法,使用一个临时temp,代码如下:
temp = data_1; data_1 = data_2; data_2 = temp;第二种方法,直接不用额外的存储空间,直接在两个数据上操作,但是这种方法有可能在两个数相加时产生越界的问题。代码如下:
<pre name="code" class="cpp">//假设data_11 = data_1, data_22 = data_2 //data_1 = data_11 + data_22 //data_2 = data_11 + data_22 - data_22 = data_11 //data_1 = data_11 + data_22 - (data_11 + data_22 - data_22) =data_22 data_1 = data_1 + data_2; data_2 = data_1 - data_2; data_1 = data_1 - data_2;
第三种方法是使用异或运算符,代码如下:
data_1 ^= data_2; data_2 ^= data_1; data_1 ^= data_2;
下面进行效率测试,对每种方法,进行大数量的操作,然后比较执行时间,代码如下:
const int num = 100000000; int main(int argc, char **argv) { int data_1 = 1234, data_2 = 5678, temp = 0; clock_t start = 0, finish = 0, duration = 0; //运行50次,取平均 for (int i=0; i<50; ++i) { start = clock(); for (int i=0; i<num; ++i) { //swap method } finish = clock(); duration += finish - start; } cout << "平均运行时间为:" << duration / 50 << "毫秒" << endl; return 0; }
运行结果:
第一种方法:平均运行时间334毫秒
第二种方法:平均运行时间879毫秒
第三种方法:平均运行时间799毫秒
结果显示,第一种方法效率最高,虽然第一种方法占据一个额外的内存空间,但是交换的三行代码实现的都是赋值操作,相对后两种的加减和异或要快很多。所以,当交换量大时,推荐用第一种方法,速度快,而且最容易理解。
相关文章推荐
- iOS中实现数据交换的几种方法介绍以及其效率对比
- c++交换数据所用的两种方法
- C++中几种不同交换两个数的方法
- C++中两个数值交换的几种方法
- mybatis学习之路----批量更新数据两种方法效率对比
- C++中两个数据交换的几种实现方式
- mybatis学习之路----批量更新数据两种方法效率对比
- <实例>C++中交换两数值的几种方法
- Java从控制台读取数据,输入流System.in的几种方法效率比较
- 几种读大文件方法的效率对比测试
- C++操作MySQL大量数据插入效率低下的解决方法
- WWF中宿主程序(即调用工作流的程序)和工作流内部交换数据的几种方法(情况)。
- C++操作MySQL大量数据插入效率低下的解决方法
- 有关于提高C/C++运行效率以及避免出现Bug的几种常见的实用方法
- 二分查找的几种方法对比,C++实现
- C++ 将数据转为字符串的几种方法
- C++几种内存分配方法的效率测试与比较
- 几种读大文件方法的效率对比测试
- Neo4J几种数据导入方式的效率对比
- C++ 将数据转为字符串的几种方法