本文将给出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 ,注意传参的时候也一样