为什么你的swap会有问题

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一下吧,骚年。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值