三路快速排序
主要解决了在数组中有大量重复数字导致排序效率下降的问题。在一个全为同一个数组的样例中,三路快排的时间复杂度为On
import java.util.Random;
public class QuickSort {
private QuickSort() {};
public static <E extends Comparable<E>> void Sort(E[] arr) {
Random rnd = new Random();
Sort(arr, 0, arr.length-1, rnd);
}
private static <E extends Comparable<E>> void Sort(E[] arr, int l, int r, Random rnd) {
if (l >= r){
return;
}
int p = l + rnd.nextInt(r-l+1);
Swap(arr, l, p);
// arr[l+1, lt] < 0 || arr[lt+1, i-1] =0 || arr[gt, r] >0
int lt = l, gt = r+1, i = l+1;
while (i < gt) {
if (arr[i].compareTo(arr[l]) < 0) {
lt++;
Swap(arr, lt, i);
i++;
} else if (arr[i].compareTo(arr[l]) == 0) {
i++;
} else {
gt--;
Swap(arr, gt, i);
}
}
// 将l与lt交换
Swap(arr, l, lt);
// 数组变为 arr[l, lt-1] < 0 || arr[lt, get-1] = 0 || arr[gt, r] > 0
Sort(arr, l, lt-1, rnd);
Sort(arr, gt, r, rnd);
}
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 <E extends Comparable<E>> boolean isSorted(E[] arr) {
for (int i = 0; i < arr.length-2; i++) {
if (arr[i].compareTo(arr[i+1]) > 0) {
return false;
}
}
return true;
}
}