swap
记录一下菜鸡的心酸历程。
一个简单的变量交换函数,大家应该都很熟悉
int tmp = x;
x = y;
y = tmp;
刷题多了,了解到位运算的速度有多nb,虽然ide会帮我们优化,但是面试的时候,或者拿给小白看,还是感觉有点逼格。
x = x ^ y;
y = x ^ y;
x = x ^ y;
问题
既然要高调一点,那就时时刻刻保持着位运算优先原则,对吧。但是自己在手撸快排的时候,用位运算进行swap出现了问题。
如下代码在进行排序的时候,出现了问题
比如nums = {5,2,3,1},大部分时候排序出来就会出现某些位置为0的情况:
public int[] quickSort(int[] nums) {
if(nums.length <2){
return nums;
}
quickSort(nums,0,nums.length-1);
return nums;
}
void quickSort(int[] nums,int l,int r){
if(l >= r){
return;
}
int tar = nums[l + (int)(Math.random()*(r - l))];
int mid = l;
int right = r;
int i = l;
for(;i <= right;){
if(nums[i] < tar){
swap(nums,i++,mid++);
}else if(nums[i] > tar){
swap(nums,i,right--);
}else{
i++;
}
}
quickSort(nums,l,mid-1);
quickSort(nums,i,r);
}
public void swap(int[] nums,int i,int j){
nums[i] = nums[i]^nums[j];
nums[j] = nums[i]^nums[j];
nums[i] = nums[i]^nums[j];
}
问题出现原因
其实这问题很简单,如果swap函数中i != j的话,一点问题都没有,即使nums[i] = nums[j]。但是如果i == j,进入这个swap函数的话,很明显就会使得该位置为0;
只有加个判断,将上面for循环内容改成如下,很明显,如果待排数组长度较大的话,if的加入很耗性能。所以在遇到数组中的元素交换的话还是将swap改成第一种吧。
for(;i <= right;){
if(nums[i] < tar){
if(i != mid){
swap(nums,i,mid);
}
i++;
mid++;
}else if(nums[i] > tar){
if(i != right){
swap(nums,i,right);
}
right--;
}else{
i++;
}
}
最后
如果你坚持看到这了,还觉得这篇文章有用,那么我提醒你,自己遇到问题的时候好好debug一下吧,骚年。