一、概念及其介绍
三路快速排序是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v,等于 v,大于 v,v 为标定值,这样三部分的数据中,等于 v 的数据在下次递归中不再需要排序,小于 v 和大于 v 的数据也不会出现某一个特别多的情况),通过此方式三路快速排序算法的性能更优。
二、适用说明
时间和空间复杂度同随机化快速排序。
三路快速排序算法是使用三路划分策略对数组进行划分,对处理大量重复元素的数组非常有效提高快速排序的过程。它添加处理等于划分元素值的逻辑,将所有等于划分元素的值集中在一起。
三、Java代码
public static void sort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int v = (int) (Math.random() * (right - left + 1) + left);
int b = arr[v];
swap(arr, v, left);
int lt = left - 1;
int gt = right + 1;
int i = left;
while (i < gt) {
if (arr[i] < b) {
swap(arr, lt + 1, i);
lt++;
i++;
} else if (arr[i] == b) {
i++;
} else if (arr[i] > b) {
swap(arr, i, gt - 1);
gt--;
}
}
sort(arr, left, lt);
sort(arr, gt, right);
}
public static void swap(int[] arr, int i, int j) {
int tem = arr[i];
arr[i] = arr[j];
arr[j] = tem;
}
public static void main(String[] args) {
int[] arr = {9, 3, 4, 1, 9, 3, 2, 8, 4, 10, 9, 10, 2, 8};
print(arr);
sort(arr, 0, arr.length - 1);
print(arr);
}
public static void print(int[] arr) {
for (int n : arr) {
System.out.print(n + " ");
}
System.out.println(" ");
}