快速排序

快速排序:
以数组中最后一个数为基准值,然后从数组的两头(即 数组下标为0,和下标为arrray.length-1处)分别开始遍历数组,将小于基准值的数放在数组的左边,将大于基准值的数放在数组的右边,最后将基准值放在这两部分中间,最后导致,基准值左边的数都比基准值小,基准值右边的数都比基准值大;
然后从基准值处分为左右两部分,对左边的那一部分数再进行快速排序,对右边的那一部分数也再进行快速排序;递归循环。
比如:数组{1,3,8,2,0,11,6,7,21,9}, 以最右边的数9为基准值,经过一次快速排序,变为:1,3,8,2,0,6,7,9,11,21;则基准值所在的下标变为7,分为两部分,然后将{1,3,8,2,0,6,7}和{11,21}分别再进行快速排序,{1,3,8,2,0,6,7}以7为基准值,{11,21}以21为1基准值,分别进行快速排序;以此类推循环。

 private  static void quickSort(int[] array){
        quickSortInner(array,0,array.length-1);
    }
    private static void quickSortInner(int[] array,int left,int right){
    //当[left,right]之间只剩一个数或没有数存在时,就结束了
        if(left==right){
            return;
        }
        if(left>right){
            return;
        }
        //先找出来基准值最终所在的位置
        int splitVaule=partion1(array,left,right);
        //int splitVaule=partion2(array,left,right);
        //int splitVaule=partion3(array,left,right);
        //然后再将基准值左边的数组按照前面的方法再次排序,
        quickSortInner(array,left,splitVaule-1);
         //同理,再将基准值右边的数组按照前面的方法再次排序,
        quickSortInner(array,splitVaule+1,right);

    }

    //获取基准值下标的方法 hover法
    private static int partion1(int[] array, int left, int right) {
        //以最右边的数为标准,将其它数与其相比较
        int vaule=array[right];
        int begin=left;
        int end=right;
        while(begin<end){
            while(begin<end&&array[begin]<=vaule){
                 begin++;
            }
            while(begin<end&&array[end]>=vaule){
                end--;
            }
            //当begin和end停止继续时,说明不满足左边的比基准值小,右边的比基准值大了
            //则将这两个位置的数互换
            int t=array[begin];
            array[begin]=array[end];
            array[end]=t;
        }
         //将基准值换到begin这个位置
        int temp=array[begin];
        array[begin]=vaule;
        array[right]=temp;

        //返回基准值所在的下标
        return  begin;

    }

找出基准值所在的位置的方法还有:挖坑法、前后下边法
挖坑法:
挖坑法与上面的hover法的不同之处就在于:将基准值保存下来,此处就相当于有一个坑,在进行遍历时,每有不满足条件的,就用那个不满足条件的数来填坑,然后不满足条件的数的位置处就变成了一个坑,等待另外一个不满足条件的数来填坑,到最后循环结束时,就用基准值来填剩下的那个坑。

 //获取基准值下标的方法 挖坑法
    private static int partion2(int[] array, int left, int right) {
        //以最右边的数为标准,将其它数与其相比较
        int vaule=array[right];
        int begin=left;
        int end=right;
        while(begin<end){
            while(begin<end&&array[begin]<=vaule){

                begin++;
            }
            array[end]=array[begin];
            while(begin<end&&array[end]>=vaule){

                end--;
            }
            array[begin]=array[end];

        }
        //将基准值换到begin这个位置
        array[begin]=vaule;

        //返回基准值所在的下标
        return  begin;


    }

前后下标法:


    //获取基准值下标的方法 前后下标法
    //0~d之间是小于基准值的,d~i之间是大于基准值的
    //将最右边的数作为基准值
    private static int partion3(int[] array, int left, int right) {
        int d=left;
        for(int i=left;i<right;i++){
            if(array[i]<array[right]){

                //就将这个数移到array[d]的前面,就保证了下标d前面的数都是小于array[right]的
                //即 将array[i]与array[d]互换位置
                int t=array[d];
                array[d]=array[i];
                array[i]=t;

                //array[d]的位置也后移一位
                d++;
            }

        }

        //最后将array[right]与array[d]换一下位置
        int temp=array[d];
        array[d]=array[right];
        array[right]=temp;

       return  d;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值