//(前两种时间复杂度为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
相关推荐
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案I_LPL5 小时前
hot100贪心专题兑生5 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Javadaidaidaiyu5 小时前
一文学习 Spring 声明式事务源码全流程总结颜酱6 小时前
DFS 岛屿系列题全解析WolfGang0073216 小时前
代码随想录算法训练营 Day16 | 二叉树 part06零雲6 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别2401_831824967 小时前
代码性能剖析工具Sunshine for you8 小时前
C++中的职责链模式实战qq_416018728 小时前
C++中的状态模式