快速排序怎么玩

思路:在待排序区间中找到一个基准值,然后以基准值为中心,将整个待排序区间整理成三个部分,基准值左边都是小于它的,基准值右边都是大于它的,最后再去递归处理左侧的区间,递归处理右侧的区间。
示例代码:

public class QuikeSort {//快速排序

    public static void main(String[] args) {
        int[] arr = {9,5,2,7,3,6,8,10,-1,4};
        quikesort(arr);
        System.out.println((Arrays.toString(arr)));

    }
    public static void quikesort(int[] arr){
        quikesorthelper(arr,0,arr.length-1);//辅助完成递归过程,从0开始,到数组尾部
    }

    private static void quikesorthelper(int[] arr,int left,int right) {
        if(left>=right){//此时代表当前数组里面有0个或一个元素的时候,就不用再排序了
            return;
        }
        //此时再针对left和right这个区间进行排序,方法的返回值就是left和right的重合值
        //,知到了这个位置才能进一步进行递归。
        int index = partation(arr,left,right);
        //再针对重合位置的左侧进行递归排序,也就是0——index-1这段区间,
        quikesorthelper(arr,left,index-1);
        //再针对重合位置的右侧进行递归排序,也就是index+1——arr.length-1这段区间
        quikesorthelper(arr,index+1,right);

    }

    private static int partation(int[] arr, int left, int right) {
        int i = left;
        int j = right;
        int base = arr[right];//base代表基准值元素
        while(i<j){//当i<j的时候找的过程就找完了
            while(i<j&&arr[i]<=base){
                i++;
            }
            //当这个循环结束的时候,i要么和j是重合的,要么指向的是比base大的元素
            while(i<j&&arr[j]>=base){//这里如果不取等于的话会把基准值也换走。
                j--;
            }
            //这个循环结束的时候,同样j要么和i重合,要么找到了比base小的元素。
            swap(arr,i,j);//此时交换i,j对应的元素。
        }
        //这个大循环结束的时候,代表i和j此时相遇了
        swap(arr,i,right);//此时要把重合位置的元素和基准值进行交换
        return i;

    }
    public static void swap(int[] arr,int i,int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j]  = tmp;
    }

}

注:
1.常见的基准值一般可以取最左侧和最右侧的元素
2.如果以最左侧为基准值的话,就需要先从右往左找,再从左往右,因为这样才能保证left和right重合的时候指向的元素小于基准值,和基准值进行互换的时候才不会打乱顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值