一、三种交换方式
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(通过设置第三方变量)来执行两个数据的交换。