//(前两种时间复杂度为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);
}