public class QuickSortThree {
private QuickSortThree() {
}
public static <E extends Comparable<E>> void sort(E[] arr) {
Random random = new Random();
sort(arr, 0, arr.length - 1, random);
}
private static <E extends Comparable<E>> void sort(E[] arr, int l, int r, Random random) {
if(l >= r){
return;
}
int p = l + random.nextInt(r - l + 1);
swap(arr, l, p);
// arr[l + 1,lt] < v ,arr[lt + 1,i - 1] == v,arr[gt,r] > v
int lt = l,i = l + 1,gt = r + 1;
while(i < gt){
if(arr[i].compareTo(arr[l]) < 0){
lt++;
swap(arr,i,lt);
i++;
}else if(arr[i].compareTo(arr[l]) > 0){
gt--;
swap(arr,i,gt);
}else{
i++;
}
}
swap(arr,l,lt);
// arr[l,lt - 1] < v , arr[lt,gt - 1] == v , arr[gt,r] > v
sort(arr,l,lt-1,random);
sort(arr,gt,r,random);
}
private static <E extends Comparable<E>> void swap(E[] arr, int i, int j) {
E temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int n = 100000;
Integer[] arr = ArrayGeneratorUtil.generateRandomArray(n,n);
Integer[] arr2 = Arrays.copyOf(arr,arr.length);
Integer[] arr3 = Arrays.copyOf(arr,arr.length);
System.out.println("Random Array");
SortHelper.sortTest(arr,"QuickSort");
SortHelper.sortTest(arr2,"QuickSortTwo");
SortHelper.sortTest(arr3,"QuickSortThree");
System.out.println();
arr = ArrayGeneratorUtil.generateOrderedArray(n);
arr2 = Arrays.copyOf(arr,arr.length);
arr3 = Arrays.copyOf(arr,arr.length);
System.out.println("Order Array");
SortHelper.sortTest(arr,"QuickSort");
SortHelper.sortTest(arr2,"QuickSortTwo");
SortHelper.sortTest(arr3,"QuickSortThree");
System.out.println();
arr = ArrayGeneratorUtil.generateRandomArray(n,1);
arr2 = Arrays.copyOf(arr,arr.length);
arr3 = Arrays.copyOf(arr,arr.length);
System.out.println("Same Array");
SortHelper.sortTest(arr,"QuickSort");
SortHelper.sortTest(arr2,"QuickSortTwo");
SortHelper.sortTest(arr3,"QuickSortThree");
System.out.println();
}
}
备注:元素相同时排序效率更高