快速排序详细分析(Java实现)

本文深入解析快速排序算法,详细阐述了其排序过程,包括选择基准数、双指针法的运用及递归调用原理。通过具体步骤解释了如何实现数组元素的正确排序,并附带代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /**
     * 排序过程
     * 1,找一个基准数,找数组内的任意一个数都行,一般都是以数组第一个数为基准数
     * 2,从数组末位向前循环找比基准数小的,找到了先停下,也就是记录当前的索引
     *   从数组开端向后循环找比基准数大的,找到了先停下,也就是记录当前的索引
     * 3,将第二步的两个索引的位置的数值交换,这样比基准数大的就到了基准数的后面, 比基准数小的就到了基准数的前面
     * 4,继续不停的重复2,3步,直到两个索引位置相等,就不用再交换了,也就是当start < end时就不停止循环
     * 5,start和end相等,停止循环,将start或end位置的数与基准数交换
     * 6,递归循环基准数左面的数组
     * 7,递归循环基准数右面的数组
     * @param arr
     * @param start
     * @param end
     *
     * 几个问题,(把索引start和end当成指针来讲)
     * start和end一定会相遇吗,或者说start和end一定会相等吗?
     *      答:一定会的,因为start和end都是一步一步移动的,移动会发生重合
     * start和end相遇或者说重合或者说索引位置一样,该位置的数一定是比基准数小的吗?(该位置的数要和基准是交换)
     *      答:因为是end先移动的,end指向的都是比比基准数小的数(start和end交换时)
     *      1当end发现比基准数小的数,start发现比基准数大的数,进行交换数据时,一定是成对出现的
     *      2当end往前移动与start相遇时,这个时候start和end已经交换了数据,start指向的就是比基准数小的数,
     *      3当start向后移动,end已经指向的是比基准数小的数,
     *      4综上;当相遇时start和end位置上的数一定是比基准数小的数,所以可以和首位置上的基准数交换
     *      5出现“相遇时start和end位置上的数一定是比基准数小的数”这种情况是移动的先后顺序引起的,如果是start
     *          先移动,则相遇时最后指向的是比基准数大的数。
     */ 


    public static void fastSort(int[] arr,int start,int end){
        if(null == arr || arr.length == 0 || start >= end)
            return;

        //将start 和 end记录下来,是为了进行左侧和右侧两段的排序
        int left = start;
        int right = end;

        int key = arr[start];

        while (start < end){
            //从后往前循环,如果不是先从后往前循环,那么排序结果是不正确的,为什么?

            while (start < end && arr[end] >= key) end--;

            //从前往后循环
            while (start < end && arr[start] <= key) start++;

            if(start < end) swap(arr,start,end);

        }
        //将基准数和start与end相等的位置的数交换位置,left位置就是最开端的数,是基准数
        //这个时候start和end是相等的,这里用end也可以
        swap(arr,left,start);
        //基准数左侧数组的排序
        fastSort(arr,left,start-1);
        //右侧的排序
        fastSort(arr,start+1,right);

    }

    
    Hello World
    输出:6,7,9,30,34,34,42,48,49,83,84,89,93,98,223,321,845,



public static void swap(int[] arr,int index1,int index2){
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;

    }
public static void main(String args[]){
        System.out.println("Hello World");
        int[] arr = {30,6,89,83,42,9,34,84,98,93,845,321,34,7,223,48,49};
        fastSort(arr,0,arr.length-1);
//        swap(arr,0,2);
        printArr(arr);
    }

    private static void printArr(int[] arr) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i : arr) {
            stringBuilder.append(i).append(",");
        }
        System.out.println(stringBuilder.toString());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值