关于快排指针的几点思考

关于快排指针的几点思考

近来复盘剑指offer21题的时候,得到了新的体会,特来分享一下。
我们都知道(maybe you do not know),应用快速排序时,我们需要维护两个指针,但是具体指针初始化在哪里,具体如何移动,终止条件又是如何,我们来具体探讨一下。
一般而言,这两个指针有两种形式,一种是一前一后,当然另一种也是一前一后,不过有不同之处,请诸位看官来看:
一、

public static void reOrderArray(int[] array) {
    	//考虑输入边界条件
        if (array == null || array.length == 0)
        	return;
        //设置两个指针,之所以这样设置,是为了可以用++index,简化代码,代码简洁之道get一下
        int left = -1;
        int right = array.length;
        //终止条件为两指针重合
        while (left < right) {
        	//与运算前面应是下标关系式,避免数组下标越界,这一点很重要,初学者谨记
        	while (left < right && (array[++left] & 0x1) == 1);
        	//后面的位运算是考虑数组变量是否为奇数
        	while (left < right && (array[--right] & 0x1) != 1);
        	if (left < right)
        		swap(array, left, right);
        }    
    }

二、

public static void reOrderArray2(int[] array) {
    	if (array == null || array.length == 0)
        	return;
    	//look,这里指针和前面不同了
    	int i = 0;
    	int j = i - 1;
    	//整体遍历一遍
    	for (i = 0; i < array.length; i++) {
    		//条件是奇数
    		if ((array[i] & 0x1) == 1) {
    			j++;
    			//优化不必要的交换
    			if (i != j)
    				swap(array, i, j);
    		}

    	}  
    }

因为快排交换是不稳定的,所以这两种算法的结果也是不同。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值