//(前两种时间复杂度为o(n^2) , 最后一种为o(n*logn)
public static void swap(int[] arr , int i , int j){
arr[i] =arr[i] ^arr[j];
arr[j] =arr[i] ^arr[j];
arr[i] =arr[i] ^arr[j];
}
//使数组中以arr[R]划分,返回循环后arr[R]的所在地
public static int partition(int[] arr , int L ,int R ){
if(L >R ){
return -1;
}
if(L == R ){
return L;
}
int lessEqual = L-1;
int index = L;
while (index <R ){
if(arr[index] <=arr[R]){
swap(arr ,index++ , ++lessEqual);
}
}
swap(arr , ++lessEqual , R);
return lessEqual;
}
//把一个数组以arr[R]划分,返回的是值为arr[R]的区间
public static int[] netherlandsFlag(int[] arr , int L , int R){
if(L>R){
return new int[] { -1 ,-1};
}
if(L ==R){
return new int[] {L ,R};
}
int less = L-1;
int more =R;
int index = L;
while (index <more){
if(arr[index] ==arr[R]){
index++;
}else if(arr[index] <arr[R]){
swap(arr ,index++ , ++less);
}else{
swap(arr ,index , --more);
}
}
swap(arr ,more ,R );
return new int[] {less+1 , more};
}
//递归1
public static void process1(int[] arr ,int L ,int R ){
if(L >=R){
return;
}
int M =partition(arr ,L ,R);
process1(arr , L , M-1);
process1(arr , M+1 ,R);
}
//快排1
public static void quickSort1(int[] arr){
if(arr ==null || arr.length <2){
return;
}
process1(arr ,0 , arr.length-1);
}
//递归2
public static void process2(int[] arr ,int L ,int R){
if(L >=R){
return;
}
int[] equalArea =netherlandsFlag(arr ,L ,R);
process2(arr ,L ,equalArea[0] -1);
process2(arr , equalArea[1] , R);
}
//快排2
public static void quickSort2(int[] arr){
if(arr ==null || arr.length <2){
return;
}
process2(arr ,0 , arr.length-1);
}
//递归3
public static void process3(int[] arr , int L ,int R){
if(L > R ){
return;
}
swap(arr ,L + (int) (Math.random() * (R - L+1)), R);
int[] equalArea = netherlandsFlag(arr , L ,R);
process3(arr , L , equalArea[0] -1);
process3(arr , equalArea[1] +1, R );
}
//快排3
public static void quickSort3(int[] arr){
if(arr == null ||arr.length <2){
return;
}
process3(arr , 0 , arr.length-1);
}
快排的3种方式
听风客12024-07-16 11:38
相关推荐
皮卡蛋炒饭.2 分钟前
数据结构—排序全栈凯哥16 分钟前
16.Spring Boot 国际化完全指南M1A123 分钟前
Java集合框架深度解析:LinkedList vs ArrayList 的对决Top`27 分钟前
Java 泛型 (Generics)爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信???tobenewyorker1 小时前
力扣打卡第23天 二叉搜索树中的众数是小崔啊1 小时前
tomcat源码02 - 理解Tomcat架构设计贝塔西塔1 小时前
一文读懂动态规划:多种经典问题和思路没有bug.的程序员1 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》栈溢出了1 小时前
MyBatis实现分页查询-苍穹外卖笔记