你会写冒泡排序吗
给你一个数组,让你排序,怎么办?(别跟我扯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=0
、1^0=1
、0^0=0
那我就是要用 5^6 会怎么样呢?5^6=?
那必是一个和5、6都无关的值啊,你在想什么?
但是课本上有这样三个公式:a^a=0
、a^a^b=b
、0^b=b
第一个我知道你懂,我第一次看也懂了,那么第二个…
假设b=3
,因为a^a=0
,所以a^a^b=0^b=0^3
,0^3
…
3的二进制是11,00^11=11
→ 还是3!
整数转二进制不过是01组合,0^0=0
,1^0=1
,那不就是0^b=b
还不懂?
再看看这组代码
arr[j] ^= arr[i];
arr[i] ^= arr[j];
arr[j] ^= arr[i];
设 arr[i]=X
、arr[j]=Y
①arr[j] ^= arr[i];
→ arr[j]=Y^X
②arr[i] ^= arr[j];
→ arr[i]=X^Y^X=Y
→ arr[i]=Y
③arr[j] ^= arr[i];
→ arr[j]=Y^X^Y=X
→ arr[j]=X
引申问题
给你一个数组,里面有若干数据,其中只有一个数据元素出现的次数是奇数次,请你找出这个出现次数为奇数次的元素。
对!文章看到这里了,你还遍历元素,给每个元素都加一个计数器,用==
对比判断。