由荷兰国旗问题演变来。
Java代码如下
public static void main(String[] args) {
int[] testArray = new int[]{2,2,1,1,3,6,4,7,9,8};
quickSort(testArray);
System.out.printf(Arrays.toString(testArray));
}
public static void quickSort(int[] arr){
if (arr == null || arr.length<2){
return;
}
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr, int L, int R) {
if (L<R){
//取随机数作为标准。
swap(arr,L+(int)(Math.random()*(R-L)),R);//
int[] p = partition(arr,L,R);
quickSort(arr,L,p[0]-1);//划分值的<区域
quickSort(arr,p[1]+1,R);//划分值的>区域
}
}
private static int[] partition(int[] arr, int l, int r) {
int less = l - 1;//<区域的右边界
int more = r;//>区域的左边界
while (l<more){
if (arr[l] < arr[r]){
swap(arr,++less,l++);//当前值和<区域的右边界下一个数进行交换并且下标向下移动一个。
}else if(arr[l] > arr[r]){
swap(arr,l,--more);//当前值和>区域的左边界的前一个做交换,并且大于区域的左边向左扩一位。
}else {
l++;
}
}
swap(arr,more,r);//此时数组已经分好,小于R的在左边,大于R的在右边,此时把右边的R和大于区域的左边界位置进行交换,就实现了R在中间。
return new int[]{less+1,more};//等于区域的左右边界。
}
private static void swap(int[] arr, int l, int r) {
int c= arr[l];
arr[l] = arr[r];
arr[r] = c;
}