交换两数,不用辅助空间

交换两数,不用辅助空间

用代码如何交换两个数,一般我们都会想到用第三个辅助的数(空间),比如:

#include<stdio.h>
int main()
{
int a=1;
int b=10;
int  temp;
printf("a=%d,b=%d\n", a, b);
temp=a;
a=b;
b=temp;
printf("a=%d,b=%d\n", a, b);
return 0;
}

结果如下:
在这里插入图片描述

但是如果我们要求不使用额外的辅助空间呢?

我们可以想到加法,让temp的值为a+b;把它看成一个整体,用temp-a可以得到b,把它赋值给a,现在的a就是原来的b,所以用temp-a(就是原来的b)可以得到a。问题就解决了。代码如下:

int main()
{
	int a = 1;
	int b = 10;
	int temp = 0;
	printf("a=%d,b=%d\n", a, b);
	temp = a + b;
	b = temp - b;
	a = temp - b;
	printf("a=%d,b=%d\n", a, b);
	return 0;
}

但是我们会遇到加法,有加法就要考虑到溢出的问题,那我们还可以想到异或的方法。
有以下结论:
A^0=A
A^A=0
所以有(A^A) ^ B=0 ^ B=B
代码如下:

#include<stdio.h>
//交换两数,不用辅助空间
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	printf("a=%d,b=%d\n", a, b);
	c = a^b;
	b = c^b;
	a = c^a;
	printf("a=%d,b=%d\n", a, b);
	return 0;
}在这里插入代码片

结果同上。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序算法在实现过程中可能会使用到辅助空间,用于存储临时数据或者辅助排序操作。不同的排序算法使用的辅助空间也不同,下面是几种常见的排序算法及其所用的辅助空间介绍: 1. 冒泡排序:冒泡排序是一种简单的排序算法,它通过相邻元素的比较和交换来进行排序。冒泡排序不需要额外的辅助空间。 2. 插入排序:插入排序是一种简单直观的排序算法,它通过构建有序序列,对未排序的数据逐个插入到已排序的序列中。插入排序不需要额外的辅助空间。 3. 选择排序:选择排序是一种简单直观的排序算法,它通过每次从未排序的数据中选择最小(或最大)元素,放到已排序序列的末尾。选择排序不需要额外的辅助空间。 4. 归并排序:归并排序是一种分治算法,它将待排序的序列分成两个子序列,分别进行排序,然后将两个有序子序列合并成一个有序序列。归并排序需要额外的与原始序列大小相等的辅助空间。 5. 快速排序:快速排序是一种分治算法,它通过选择一个基准元素,将序列分成两个子序列,小于基准元素的放在左边,大于基准元素的放在右边,然后对两个子序列进行递归排序。快速排序不需要额外的辅助空间。 6. 堆排序:堆排序是一种利用堆的数据结构进行排序的算法,它通过构建最大堆或最小堆来实现排序。堆排序不需要额外的辅助空间

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值