由于当数组有序时,也就是快速排序法的最差情况下,每次选定的都是最左边的元素,而我们又希望能选择整个数组中间的位置元素,如果不能准确的定位中间位置的元素,我们可以利用随机选择一个元素,此时的利用随机选取的快速排序的期望值为nlogn。
import java.util.*;
public class QuickSort {
// 对arr[l...r]部分进行partition操作
// 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
private static int partition(Comparable[] arr, int l, int r){
// 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
swap( arr, l , (int)(Math.random()*(r-l+1))+l );
Comparable v = arr[l];
int j = l; // arr[l+1...j] < v ; arr[j+1...i) > v
for( int i = l + 1 ; i <= r ; i ++ ){
if( arr[i].compareTo(v) < 0 ){
j ++;
swap(arr, j, i);
}
}
swap(arr, l, j);
return j;
}
// 递归使用快速排序,对arr[l...r]的范围进行排序