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();
}
}