//(前两种时间复杂度为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
相关推荐
Derek_Smart2 分钟前
Java线程死亡螺旋:解析与预防策略翁正存8 分钟前
IDEA测试代码报java file outset source root异常励志五个月成为嵌入式糕手16 分钟前
0819 使用IP多路复用实现TCP并发服务器Mi_Manchikkk23 分钟前
Java高级面试实战:Spring Boot微服务与Redis缓存整合案例解析停停的茶1 小时前
决策树(2)汤永红1 小时前
week2-[一维数组]最大元素菜鸟555554 小时前
图论:Floyd算法呼啦啦啦啦啦啦啦啦9 小时前
常见的排序算法anlogic9 小时前
Java基础 8.18胡萝卜3.010 小时前
数据结构初阶:排序算法(一)插入排序、选择排序