C语言中两种交换变量值方法的速度测试

常见的交换两个变量值的方法有三种:

  • 最常见的一种方法,利用临时变量,交换两个变量的值。这种方法在生活中也很常见,假设有一个杯子A,其中有盛有饮料a,另有一个杯子B,其中盛有饮料b,如果我们想要把A和B两个杯子里的饮料对调,会借助一个空杯子C,先把A中的饮料a倒在空杯子C中,C中有了饮料a,于是A变成了空杯子,这时把B中的饮料b倒在A中,于是A中有了饮料b,B成了空杯子,最后将C中的饮料a倒在B中,B中有了饮料a,此时完成对调。

  • 第二种方法,利用数值异或运算两次不变的性质,交换两个变量值。

  • 第三种方法,利用两数之和减去一个数等于另一个数的性质,交换两个变量值。例如,10+1=11,10在前,1在后,通过11-10=1与11-1=10的变换后,1在前,10在后,两数完成交换。这种方法可能会造成数值溢出,比如两个绝对值较大的负数交换时,因此常规编程中不采用。

C语言的代码实现:

#include <stdio.h>
#include <time.h>
// 两种方法循环十亿次
#define N 1000000000

// 异或运算交换
void swap_a(int *a, int *b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

// 辅助变量交换
void swap_b(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void show_a()
{
    int a = 1, b = 2;
    clock_t begin, end;
    begin = clock();
    for (int i = 0; i < N; i++)
    {
        swap_a(&a, &b);
    }
    end = clock();
    printf("time a:%lfs
", (double)(end - begin) / CLOCKS_PER_SEC);
}

void show_b()
{
    int a = 1, b = 2;
    clock_t begin, end;
    begin = clock();
    for (int i = 0; i < N; i++)
    {
        swap_b(&a, &b);
    }
    end = clock();
    printf("time b:%lfs
", (double)(end - begin) / CLOCKS_PER_SEC);
}

int main()
{
    show_a();
    show_b();
    return 0;
}

输出结果:

time a:17.846000s
time b:8.940000s

输出结果证明,利用辅助变量进行值的交换,运算效率最高,而此种方法也最常用,可读性也最高。

如文章内容有错误,欢迎在评论中指正

原文地址:https://www.cnblogs.com/biem/p/13583187.html