zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    LockFree的栈实现及与加锁实现的性能对比
    redis源码笔记-redis.conf
    【ASP.NET】应用程序、页面和控件的生命周期
    【ASP.NET】HTTP客户请求的数据格式说明
    【ASP.NET】页面间传值
    【ASP.NET】Page.IsPostBack 属性
    【ASP.NET】互联网HTTP连接等出错代码大全
    【经验分享】抽象类、虚函数、接口、多态 概念与关系的理解
    【架构设计】需求分析
    【经验分享】常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/biem/p/13583187.html
Copyright © 2011-2022 走看看