leecode算法练习----快速排序算法

JDK中的排序算法其实也是一个双轴快速排序

/**
 * @Author George
 * @Date 2022/6/16 9:54
 * @PackageName:com.kobe.leecode_SortingAlgorithm
 * @ClassName: QuickSorting
 * @Description: TODO  快速排序法  其实就是分区排序法
 * ----引入了一个分区指示器  可以降低空间复杂度
 * 通过基准数  对数组进行分区
 * 然后对分区 继续使用分区   不断迭代  最后达到排序的目的
 * JDK中的快速排序是双轴快速排序
 * @Version 1.0
 */

package com.kobe.leecode_SortingAlgorithm;

import java.util.Arrays;


public class QuickSorting {
    public static void main(String[] args) {
        int[] arr=new int[]{39,99,86,23,32,45,58,63,93,4,33,22};
        solution002 KK = new solution002();
        int[] res = KK.sort(arr,0,11);
        KK.PringArray(res);
    }
}
class solution002{
    public int[] sort(int[] array,int start,int end){
        if(array.length<1||start<0||end>=array.length||start>=end){
            return null;
        }
        //数据分成两个独立的部分时   从哪儿分区指示器
        int zoneIndex=partition(array,start,end);
        if(zoneIndex>start)
            sort(array,start,zoneIndex-1);
        if(zoneIndex<end)
            sort(array,zoneIndex+1,end);
        System.out.println("本轮排序后的数组");
//        PringArray(array);
        System.out.println("----------------");
        return array;
    }


    public  int partition(int[] array,int start,int end){
        //只有一个元素时  无需再分区
        if (start==end) {
            return start;
        }
        //随机选取一个基准数
        int pivot=(int)(start+Math.random()*(end-start+1));
        //定义分区指示器   初始值为分区头元素减一
        int zoneIndex=start-1;
        System.out.println("开始下标:"+start+",结束下标:"+end+",基准数下标:"+
                pivot+",元素值:"+array[pivot]+",分区指示器下标:"+zoneIndex);
        //将基准数和分区尾元素交换位置
        swap(array,pivot,end);
        for(int i=start;i<=end;i++){
            //当前元素小于基准数
            if(array[i]<=array[end]){
                //首先将分区指示器累加
                zoneIndex++;
                //当前元素在分区指示器右边时,交换当前元素和分区指示器指定的元素
                if (i>zoneIndex) {
                    swap(array,i,zoneIndex);
                }
            }
            System.out.println("分区指示器:"+zoneIndex+",遍历指示器:"+i);
//            PringArray
        }
        System.out.println("---------------");
        PringArray(array);
        return zoneIndex;
    }


    private static void swap(int[] array, int pivot, int end) {
        int temp=array[pivot];
        array[pivot]=array[end];
        array[end]=temp;
    }

    public void PringArray(int[] kobe) {
        for(int i=0;i<kobe.length;i++){
            System.out.print("["+kobe[i]+"]");
        }
        System.out.println();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值