1 算法原理
将数组划分为三部分,大于v,小于v和等于v,设置三个指针,优点就是无需对重复元素进行重复操作,性能有所优化
2 时间复杂度
O(logn*n)
3 实现
/**
* 三路快排
*
* @author xld
*
*/
public class QuickSortThreeWay {
public static void sort(int[] arr) {
int n = arr.length;
sort(arr, 0, n - 1);
}
public static void sort(int[] arr, int l, int r) {
if(r<l)
return;
int v = arr[l];
int lt = l;
int gt = r+1;
int i = l + 1;
while (i < gt) {
if (arr[i] < v) {
swap(arr, i, lt + 1);
lt++;
i++;
} else if (arr[i] > v) {
swap(arr, i, gt - 1);
gt--;
} else {
i++;
}
}
swap(arr, l, lt);
sort(arr, l, (lt-1));
sort(arr, gt, r);
}
private static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
QuickSortThreeWay.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
System.out.print(' ');
}
System.out.println();
}
}