交换两个变量

本文将给出java代码,其实语言什么的不重要,重要的是算法思想
其实本文本来是要总结排序算法的,但是前面就写了这么多,就分开好了
排序总结看这里---->>>>

首先,实现交换操作的时候,将使用高级操作:不使用中间变量交换两个变量
这里有两种方法,分别是减法和异或
先看减法

a=b-a;
b=b-a;
a=b+a;

这里有一种很好理解记忆的几何原理
假设a,b是数轴上的两个点,那么b-a是两点的举例 用a保存
那么b-a就是原来a到原点的距离就等于a,
然后再用a的距离(此时保存在b中)加上两点的距离a ,就是原来b到原点的距离,就是b

然后就是异或

a=a^b
b=a^b
a=a^b

需要知道异或的几个性质,0^x=x , 1^x=(~x) , x^x=0
所以关键在于,值a^b 与a异或就能得到b,与b异或就能得到a

但是java中是传值,无法像c一样用指针写swap,下面提供两种方法

int swap(int a, int b) {  
   return a;
}
y = swap(x, x=y);

第二种用反射

public static void swap(Integer a ,Integer b) {
		try {
			Integer temp = new Integer(a);
			Class swapclass = Integer.class;
			Field field = swapclass.getDeclaredField("value");
			field.setAccessible(true);
			field.set(a, b.intValue());
			field.set(b,temp);
		}catch(NoSuchFieldException e) {
			e.printStackTrace();
		}catch(IllegalAccessException e) {
			e.printStackTrace();
		}
	}

因为是使用反射,所以要用Integer ,注意传参的时候也一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值