【C语言】实现两个数据交换(三种方式)

一、三种交换方式

1.通过中间容器

#include<stdio.h>

int main()
{
	int a=5;
	int b=6;
	int temp=0;//设置int类型变量temp作为数据a与数据b的周转容器
	
	printf("交换前a=%d,b=%d\n",a,b);
	temp=a;
	a=b;
	b=temp;
	printf("交换后a=%d,b=%d\n",a,b);
	
	return 0;
 } 

2.通过算术加减

#include<stdio.h>

int main()
{
	int a=5;
	int b=6;
	//数据a的容器起到了周转数据的作用
	printf("交换前a=%d,b=%d\n",a,b);
	a=a+b;//此时容器a存储的是a与b的数据之和
	b=a-b;//此时容器b存储的是数据a
	a=a-b;//此时容器a存储的是数据b
	printf("交换后a=%d,b=%d\n",a,b);
	
	return 0;
 } 

3.通过异或移位

#include<stdio.h>

int main()
{
	int a=5;//0101
	int b=6;//0110
	
	printf("交换前a=%d,b=%d\n",a,b);
	a=a^b;//此时容器a:0011
	b=a^b;//此时容器b: 0101 即数据a值
	a=a^b;//此时容器a: 0110 即数据b值
	printf("交换后a=%d,b=%d\n",a,b);
	
	return 0;
 } 

二、效率分析

1.从空间占用上分析

方式1>方式2=方式3(空间占用大小)

方式1代码量多一条int类型定义中间容器,会开辟一块4字节的内存空间。

方式2与方式3占用空间相同。

2.从时间效率上分析

 方式2>方式3>方式1(运行时间)

方式1和方式2在不同编译器可能会因编译器优化产生不同效果

我这里采用vs2022测试三种方式用时(附案例代码)

方式1测试截图

方式2测试截图

方式3测试截图

 案例代码(方式1):

#include<stdio.h>
#include<time.h>
#define NUM 10000000000 //100亿次 

int main()
{
	int a = 5;
	int b = 6;
	int temp = 0;//设置int类型变量temp作为数据a与数据b的周转容器
	int i=NUM;
	time_t start, end;
	double cost = 0;
	int j=0;
	double average=0;
	
	while(j<10)
	{
		i=NUM;
		start = clock();
		while (i > 0)
		{
			//printf("交换前a=%d,b=%d\n",a,b);
			temp = a;
			a = b;
			b = temp;
			//printf("交换后a=%d,b=%d\n",a,b);
			i--;
		}
		end = clock();
		cost = (double)(end - start) / CLOCKS_PER_SEC;
		average+=cost;
		printf("方式1用时:%lf\n", cost);
		j++;
	}
	printf("-------------------------------------\n");
	printf("平均用时:%lf\n",average/10);
	
	return 0;
}

案例代码(方式2):

#include<stdio.h>
#include<time.h>
#define NUM 10000000000 //100亿次 

int main()
{
	int a=5;
	int b=6;
	int i=NUM;
	time_t start,end;
	double cost=0;
	int j=0;
	double average=0;
	
	while(j<10)
	{
		i=NUM;
		start=clock();
		while(i>0)
		{
			//printf("交换前a=%d,b=%d\n",a,b);
			a=a+b;//此时容器a存储的是a与b的数据之和
			b=a-b;//此时容器b存储的是数据a
			a=a-b;//此时容器a存储的是数据b
			//printf("交换后a=%d,b=%d\n",a,b);
			i--;
		}
		end=clock();
		cost=(double)(end-start)/CLOCKS_PER_SEC;
		average+=cost;
		printf("方式2用时%lf\n",cost);
		j++;
	}
	printf("-------------------------------------\n");
	printf("平均用时:%lf\n",average/10);
	
	return 0;
 } 

 案例代码(方式3):

#include<stdio.h>
#include<time.h>
#define NUM 10000000000 //100亿次 

int main()
{
	int a=5;//0101
	int b=6;//0110
	int i=NUM;
	time_t start,end;
	double cost=0;
	int j=0;
	double average=0;
	
	while(j<10)
	{
		i=NUM;
		start=clock();
		while(i>0)
		{
			//printf("交换前a=%d,b=%d\n",a,b);
			a=a^b;//此时容器a:0011
			b=a^b;//此时容器b: 0101 即数据a值
			a=a^b;//此时容器a: 0110 即数据b值
			//printf("交换后a=%d,b=%d\n",a,b);
			i--;
		}
		end=clock();
		cost=(double)(end-start)/CLOCKS_PER_SEC;
		average+=cost;
		printf("方式3用时%lf\n",cost);
		j++;
	}

	printf("-------------------------------------\n");
	printf("平均用时:%lf\n",average/10);
	
	return 0;
 } 

三、综合分析

        程序会在空间占用和时间效率两者之间左右摇摆,一般要想获得更高的时间效率,就需要牺牲更多的空间;想要减少空间的占用,往往需要降低时间的效率。

        在本次测试中,方式1所占空间比其他两种方式多出量不大,时间效率上是最快的,考虑到现在内存一般比较充足,建议用方式1(通过设置第三方变量)来执行两个数据的交换。

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SecureCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值