冒泡排序的异或优化

你会写冒泡排序吗

给你一个数组,让你排序,怎么办?(别跟我扯sort函数)
方法很多,但是看标题,今天就用冒泡!
请添加图片描述
你可能会这样写?

public int[] poLuPoLuSort(int[] arr){
	int temp;
    for (int i = 0; i < arr.length; i++){
        for (int j = 0; j < arr.length; j++){
            if (arr[i] > arr[j]){
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

也或许你会这样写

public int[] poLuPoLuSort(int[] arr){
	int temp;
    for (int i = 0; i < arr.length; i++){
        for (int j = i+1; j < arr.length; j++){
            if (arr[i] > arr[j]){
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

有没有想过不要temp?

temp作为冒泡排序中的经典变量,你可曾想过哪一天能够把它去除?把值交换做到想象中的一样简单,交换就是交换,为嘛我的先给路人甲,你的再给我,你再去向路人甲要,没路人甲就不办事了吗?
你不妨试一下这种写法:

public int[] poLuPoLuSort(int[] arr){
    for (int i = 0; i < arr.length; i++){
        for (int j = i+1; j < arr.length; j++){
            if (arr[i] > arr[j]){
                arr[j] ^= arr[i];
                arr[i] ^= arr[j];
                arr[j] ^= arr[i];
            }
        }
    }
    return arr;
}

你看到了,这次没有temp了。

如何用异或运算交换变量值

你我都懂,异或运算是用在二进制之间的一种运算,同则0异则1…巴拉巴拉…。1^1=01^0=10^0=0

那我就是要用 5^6 会怎么样呢?5^6=?
那必是一个和5、6都无关的值啊,你在想什么?

但是课本上有这样三个公式:a^a=0a^a^b=b0^b=b

第一个我知道你懂,我第一次看也懂了,那么第二个…
假设b=3,因为a^a=0,所以a^a^b=0^b=0^30^3
3的二进制是11,00^11=11 → 还是3!

整数转二进制不过是01组合,0^0=01^0=1,那不就是0^b=b

还不懂?
再看看这组代码

arr[j] ^= arr[i];
arr[i] ^= arr[j];
arr[j] ^= arr[i];

arr[i]=Xarr[j]=Y
arr[j] ^= arr[i];arr[j]=Y^X
arr[i] ^= arr[j];arr[i]=X^Y^X=Yarr[i]=Y
arr[j] ^= arr[i];arr[j]=Y^X^Y=Xarr[j]=X

引申问题

给你一个数组,里面有若干数据,其中只有一个数据元素出现的次数是奇数次,请你找出这个出现次数为奇数次的元素。

对!文章看到这里了,你还遍历元素,给每个元素都加一个计数器,用==对比判断。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值