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();
}
}