快排的复习

快排的主要思想还是在递归上面。第一步先来了解一下快排的子公式是什么:
1、现在有一个数组,快排主要做的就是对数组进行一次调节数据顺序,在数组中找最后一个数(或者随机一个数)n,将数组内数据的顺序变成n的左边全部是比n小的数,n的右面全部是比n大的数。
2、具体操作:设最后一个数为R,第一个数为L,
当L开始与进行对比,那么就会有3种情况:该数比R大,比R小,等于R。
当L比R大时,我们知道此时的L应该放在最右面,所以让最右面的数与L进行交换,此时的L指向的是被交换过来的数,那么应该再次比较。
当L比R小时
我们可以不进行操作,让L指向下一个数,但是我们希望一次快排后左面全部是比R小的数,而不能存在和R相等的数,因此我们在这里加了一步操作,增加一个指针less,初始值为L-1,然后执行交换操作位置是++less,L++。举个例子

那么L=R时我们就只执行L++就可以了

  public static void quickSort(int[] arr) {
        if (arr==null || arr.length ==2) {
            return;
        }

        doQuickSort(arr,0,arr.length-1);
    }

    public static void doQuickSort(int[] arr, int l ,int r){
        if (l<r) {
            int[] p = position(arr,l,r);
            doQuickSort(arr,l,p[0]-1);
            doQuickSort(arr,p[1]+1,r);
        }
    }

   public static int[] position(int[] arr,int l ,int r){
        int less = l-1;
        int more = r;
        while (l<more) {
            if (arr[l] < arr[r]) {
                swap(arr,++less,l++);
            }else if (arr[l] > arr[r]){
                swap(arr,--more,l);
            }else l++;
        }
        swap(arr,r,l);

        return new int[] {
                less,
                more
        };
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值