异或和加减的方法实现两个变量值的置换

背景

在对经典排序算法进行复习的时候,发现排序算法对数组队列等数组结构中元素的操作大几率会用到交换两个变量的值(在逻辑上表现为交换两个元素的位置),基础操作会是在额外声明一个新变量用于辅助交换元素的临时存值空间,比如

冒泡排序实现算法(java)

```java
for(int i = 0;i<array.length;i++) {
	for (int j = 0;j<array.length-i-1;j++) {
		if (array[j]>array[j+1]) {
            int temp =0;    //设置临时存储功能的变量
			temp = array[j];
			array[j] = array[j+1];
			array[j+1] = temp;
		}
	}
}
```  

temp 就是起到了这个临时变量的作用

要想做到不使用临时变量存储对两个数进行位置互换(逻辑上),是不是可以通过数学关系上两者的运算来达到这个效果,以下对此优化,做到不使用额外的变量空间置换两个数

  • 优化方法1:
    • 算数运算(加减)

      x=x+y; //x暂存两数之和
      y=x-y; //y为两数之和减去y,即原来的x
      x=x-y; //x为两数之和减去现在的y(原来的x),变成原来的y
      

      以上对纯数字的值进行操作符合数学关系

      x 看成array[j],y 看成array[j+1],将核心代码优化一下

      array[j] = array[j]+array[j+1];
      array[j+1] = array[j] - array[j+1];
      array[j] = array[j] - array[j+1];
      

      实际上可读性就可能很牵强了

  • 优化方法2:
    逻辑运算(异或)
    x^=y;//x先存x和y两者的信息
    y^=x;//保持x不变,利用x异或反转y的原始值使其等于x的原始值
    x^=y;//保持y不变,利用x异或反转y的原始值使其等于y的原始值
    
    同理将核心代码优化结果
    array[j] ^= array[j+1];
    array[j+1] ^= array[j];
    array[j] ^= array[j+1];
    
    可读性可能也是差强人意

以上只是对方法的探讨。

posted on 2020-05-28 12:47  CodingAnt_Ricky  阅读(185)  评论(0)    收藏  举报