使用java调试用于插入排序的xor交换

使用java调试用于插入排序的xor交换,java,sorting,Java,Sorting,我使用xor-swap的插入排序不起作用,但如果没有xor-swap,它就可以正常工作。 如何修复xor交换插入排序算法 不带xor交换的插入排序- //sorts the given array in " increasing order " private static void insertionSort(char[] array) { // save the length of array final int LENGTH = array.length

我使用xor-swap的插入排序不起作用,但如果没有xor-swap,它就可以正常工作。 如何修复xor交换插入排序算法

不带xor交换的插入排序-

//sorts the given array in " increasing order "
   private static void insertionSort(char[] array) {
     // save the length of array 
      final  int  LENGTH = array.length ;

    //loop through selecting second character as  first element is already sorted
        for(int i = 1 ; i < LENGTH ; ++i )
             {
            char current  =  array[i];
            //place the array[i] in "order" with elements placed towards left of itself
                  for( int j = i - 1 ; (j >=0 && array[j+1] < array[j]) ; --j )
                  {


                      array[j+1] = array[j] ;
                      array[j] = current ;
                  }
              }



    }
//按“递增顺序”对给定数组排序
私有静态void insertionSort(char[]数组){
//保存数组的长度
最终整数长度=array.LENGTH;
//循环选择第二个字符,因为第一个元素已排序
对于(int i=1;i=0&&array[j+1]
使用xor交换--

//按“递增顺序”对给定数组排序
私有静态void insertionSort(char[]数组){
//保存数组的长度
最终整数长度=array.LENGTH;
//循环选择第二个字符,因为第一个元素已排序
对于(int i=1;i=0&&array[j+1]

谢谢

执行顺序与
^=
运算符是正确关联的,因此您编写的代码相当于:

a ^= (b ^= (a ^= b));
^=运算符只是a=a^b的简写形式,因此,如果完全展开此运算符,则会得到:

a = a ^ (b = b ^ (a = a ^ b));
现在请记住,
a
的值将在表达式求值开始时获取,而不是在执行时获取。想象一下
a
b
取值
5
10
。您正在有效地计算:

a = 5 ^ (b = 10 ^ (a = 5 ^ 10));
实际上,您需要将第一个
5
设置为
15
,交换才能工作

因此,正如Alan Stokes所指出的,您需要将表达式分离为三条(或者可能只有两条)语句,以便告诉编译器在下一阶段的计算中应该使用每一条语句的结果

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

我不知道这一行是如何解析的;你真的确定吗?为什么不把它作为一系列作业写出来;它不仅更具可读性,而且你可能会发现它开始工作了。我打赌一旦你开始工作,它会比原来的慢。(对O(N^2)排序实现进行微优化肯定是有点浪费。)只是试验,是的,xor交换确实有效我知道xor交换有效;我只是不相信你已经正确地实施了它。(你似乎已经证明你没有)我知道很多基于C的语言。Java处理操作分配的方式相当特殊。
a ^= b;
b ^= a;
a ^= b;