快速排序QQQ

  • 快速排序

    快速排序较于较于排序优点:

    • 冒泡排序每一次的遍历,只找到需要的元素,遍历的次数多,虽然可以优化,但约等于可以O(n*n);
    • 快速排序,每一次遍历对原区间一分为二,约等于看成O(logn);
  • 上图说话,假设原数组:4936258,两个关键点,首尾下标

    4936258
    startend

    以start下标的元素为基点,做对比,思路:比4大的元素放右边,比4小的放左边,在递归操作,就能达到我们要的效果;

    判断过程:

    ​ 8比4大,不需要操作,end往前移动一位,5比4大不需要操作,end往前移动一位,2比4小,需要操作,交换元素,未交换元素前下标元素对应关系图:

    4936258
    startend

    交换元素后结果:

    2936458
    startend

    ​ 这个时候需要从start下标位置判断,2小于4,start下标前移一位,9比4大,需要交换元素,交换元素后结果图:

    2436958
    startend

    依次操作,最后start = end,退出循环,首次结果是:

    2346958

    下面就是执行递归,代码如下:

    import com.alibaba.fastjson.JSON;
    
    /**
     * @ClassName ThreeLeetCode
     * @date 2021/7/14 15:29
     * @Description 快速排序
     * @Author bXiua
     * @Version 1.0
     */
    public class ThreeLeetCode {
        public static void main(String[] args) {
            int[] arrays =new int[]{11,9,3,6,2,5,8,0,122,1,56,2,66,4,77,5};
            sortNumber(arrays,0,arrays.length-1);
            System.out.println(JSON.toJSONString(arrays));
        }
    
        private static int sortNumber(int[] arrays, int start, int end) {
            if (start < end) {
                int index = getIndex(arrays, start, end);
                sortNumber(arrays, start,index - 1);
                sortNumber(arrays,index + 1, end);
            }
            return start;
        }
    
        private static int getIndex(int[] arrays, int start, int end) {
            int temp = arrays[start];
            while (start < end) {
                while (arrays[end] >= temp && start < end) {
                    end--;
                }
                arrays[start] = arrays[end];
                arrays[end] = temp;
                while (arrays[start] <= temp && start < end) {
                    start++;
                }
                temp = arrays[end];
                arrays[end] = arrays[start];
                arrays[start] = temp;
            }
            return start;
        }
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值