1 排序原理
它是随机快速排序的优化,将小于表定点和大于表定点的元素的位置放在数组的两端,设置两个指针,指针对撞 !
好处是将等于v的元素分散到数组的两部分,当面临大量的重复键值的情况下,可以保证不会将算法退化到O(n^2)的情况
2 时间复杂度
O(logn*n)
3 实现
/**
* 双路快排 指针对撞
*
* @author xld
*
*/
public class QuickSortTwoWay {
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 p = partition(arr, l, r);
sort(arr, l, p -
1);
sort(arr, p +
1, r);
}
public static int partition(
int[] arr,
int l,
int r) {
int v = arr[l];
int i = l +
1;
int j = r;
while (
true) {
while (i <= r && arr[i] < v)
i++;
while (j > l +
1 && arr[j] > v)
j--;
if(i>j)
break;
swap(arr,i,j);
i++;
j--;
}
swap(arr,l,j);
return j;
}
public static void swap(
int[] arr,
int a,
int b){
int temp = arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
public static void main(String[] args) {
int[] arr = {
10,
9,
8,
7,
6,
5,
4,
3,
2,
1};
QuickSortTwoWay.sort(arr);
for(
int i =
0 ; i < arr.length ; i ++ ){
System.out.print(arr[i]);
System.out.print(
' ');
}
System.out.println();
}
}