交换两个数swap

交换两个数swap

0.说明

前面在做一些基础的排序算法实现的时候,经常会遇到交换两个数据的值,但是交换两个数据的值的方法主要有三种方案,本文就主要讲讲这三种方案。

1. 方案一

这是最为简单的一种方案,就是先开辟一个空间,用作临时存放空间,为了方便说明,我们先看下图示:

新空间交换

首先是a,b都是自己原来的值,

第1步的时候,临时空间保存a的值,也就是10。

第2步的时候,将a的值设置为b的值,也就是a的值已经为20了。

第3步的时候,将b的值设置为临时空间存放的值,也就是10。

这样也就将a和b的值做一次交换,缺点就是需要一个额外的空间。

实现代码:

public static void swap(int a, int b) { int tmp = a; a = b; b = tmp; }

2. 方案二

这种方法也比较简单,但是可以完全的本地操作,也就是不用占用额外的空间来临时存放数据。我们直接看图:

加减操作

很明显,在图中可以看出,第一次计算后,a和b都没有成为目标值;

第2步的时候, b的值已经是目标值值了;

第三步的时候,a的值也称为目标值。

其中的理论就是,两个数先加,一个数等于加后的和减去本身,就是另外一个数。和的值可以说是带有两个交换数据的基因,从中能够获得最终的值,这种带有基因的数据,在以后真实的业务场景,或者是分库分表中说不定会有用到。

实现代码:

public static void swap2(int a, int b) { a = a + b; b = a – b; a = a – b; }

3. 方案三

这种方式比较难理解,主要用到的是异或操作,对于异或操作,有一个这样的性质,就是一个数如果两次对同一个数进行异或操作,得到的还是本身。我们先看下图,主要看下图中数据对应的二进制:

异或操作

可见,得到值的步骤和方案二类似,除了具有方案二中的优点,就是计算使用的是位操作,这可是计算机的长项,性能更优。

实现代码:

public static void swap3(int a, int b) { a = a ^ b; b = a ^ b; a = a ^ b; }

4. 总结

三种方案中,个人认为最后一种是最优的(上面三种方案的执行效率笔者在这里就不在做实验了,有兴趣的可以多随机点数据试一试,统计比较下),在开发一些底层应用的时候,很方便使用这种方案,但是如果是一些业务应用的话,个人认为还是方案一比较好,因为方案一的可读性比较强,但是作为软件工程师,个人认为这三种方案的原理还是应该知道的。

这里有一个在实际编码中需要注意的地方,就是对于实参和行参,交换方法内执行的是行参的值,所以操作的时候如果行参是引用,那么操作的也会影响实参,各位读者注意这点。

突然想起来刚毕业那会,面试一家公司,当笔者写出来方案二的时候,他竟然说错了,我让他再研究下,他说,这方法好,然后我写了方案三,他更懵逼了,然后笔者就找借口走人了…

希望本文能对您理解数据交换有所帮助。

求**评论、点赞、关注+转发**

限于笔者知识有限,如果不足之处请帮忙指正,不喜勿喷!

您的支持是我不懈努力的动力,请读者多支持下!

更多文章,请关注微信公众号 CS_Toper之路,或者头条号 CSToper

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Proudly powered by WordPress | Theme: HoneyWaves by SpiceThemes