经典的快速排序是思路如下:
(1)就是将弱化版的荷兰国旗问题中的num,替换成了数组的最后一个位置的数字,即根据数组的最后的一个数字,作为比较对象,然后分出大于和小于部分
(2)然后将左右两个子数组分别进行递归
首先我们看看弱化版的荷兰国旗问题:
给定一个数组arr, 和一个数num, 请把小于等于num的数放在数组的左边, 大于num的数放在数组的右边。
要求额外空间复杂度O(1), 时间复杂度O(N)
直接上其代码:
package NetherlandsFlag;
import java.util.Arrays;
public class NetherlandsFlagWeaken {
public static void partition(int[] arr,int L,int R,int num) {
int less=L-1;
int current=L;
while (current<R) {
if (arr[current]<=num) {
change(arr, current++, ++less);
}else {
current++;
}
}
}
//定义交换方法
public static void change(int[] arr,int i,int j) {
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
}
根据这个可以直接上经典的快速排序
代码:
package NetherlandsFlag;
import java.util.Arrays;
public class QuickSort {
public static void quickSort(int[] arr) {
if (arr.length<2||arr==null) {
return;
}
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr, int L, int R) {
if (L<R) {
int p=partition(arr, L,R, arr[R]);
quickSort(arr,L,p);
quickSort(arr,p+1,R);
}
}
public static int partition(int[] arr,int L,int R,int num) {
int less=L-1;
int current=L;
while (current<R) {
if (arr[current]<num) {
change(arr, current++, ++less);
}else {
current++;
}
}
return less;
}
//定义交换方法
public static void change(int[] arr,int i,int j) {
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
}
荷兰国旗版代码:
package NetherlandsFlag;
import java.util.Arrays;
public class QuickSort1 {
public static void quickSort(int[] arr) {
if (arr.length<2||arr==null) {
return;
}
quickSort(arr,0,arr.length-1);
}
public static void quickSort(int[] arr, int L, int R) {
if (L<R) {
int[] p=partition(arr,L,R);
quickSort(arr, L, p[0]);
quickSort(arr, p[1], R);
}
}
public static int[] partition(int[] arr, int L, int R) {
int less=L-1;
int more=R+1;
int current=L;
while (current<more) {
if (arr[current]<arr[R]) {
change(arr, current++, ++less);
}else if (arr[current]>arr[R]) {
change(arr, current, --more);
}else {
current++;
}
}
return new int[] {less,more};
}
public static void change(int[] arr,int i,int j) {
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
}
在荷兰国旗的基础上还可以加上一个随机快速排序:
代码:
package NetherlandsFlag;
import java.util.Arrays;
public class QuickSort1 {
public static void quickSort(int[] arr) {
if (arr.length<2||arr==null) {
return;
}
quickSort(arr,0,arr.length-1);
}
public static void quickSort(int[] arr, int L, int R) {
if (L<R) {
change(arr, R, 1+(int)Math.random()*(R-L+1));
int[] p=partition(arr,L,R);
quickSort(arr, L, p[0]);
quickSort(arr, p[1], R);
}
}
public static int[] partition(int[] arr, int L, int R) {
int less=L-1;
int more=R+1;
int current=L;
while (current<more) {
if (arr[current]<arr[R]) {
change(arr, current++, ++less);
}else if (arr[current]>arr[R]) {
change(arr, current, --more);
}else {
current++;
}
}
return new int[] {less,more};
}
public static void change(int[] arr,int i,int j) {
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
}