随机快速排序算法最坏时间复杂度O(n^2).
快速排序主要做的任务就是,选取一个基准值x,然后将小于x的值放在区域左边,等于x的值放在中间,大于x的值放在区域的右边。而孙随机快速排序则是从趋于中随机选则一个值与右边界进行交换然后作为基准值。“l = L+(int)(Math.rondam()*(R-L+1));”
优点:
传统快速排序在选择基准值的时候,选择偏差较大,导致时间复杂度增高。而选择随机快速排序则会使选择偏差较大的情况从必然事件变成概率事件。
代码:
public class RondamQuickSort {
public static void quickSort(int[] arr) {
if(arr ==null || arr.length<2) {
return ;
}
process(arr,0,arr.length-1);
}
public static void process(int[] arr,int L,int R) {
if(L>=R) return;
//
swap(arr, L+(int)(Math.random()*(R-L+1)), R);
int[] equalArea = netherlands(arr,L,R);
process(arr, L, equalArea[0]-1);
process(arr, equalArea[1]+1, R);
}
public static void swap (int[] arr ,int i ,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static int[] netherlands(int[] arr,int L,int R) {
if(L>R) {
return new int[] {-1,-1};
}
if(L==R) {
return new int[] {L,R};
}
int less = L-1;
int more = R;
int index = L;
while(index<more) {
if(arr[index] == arr[R]) {
index++;
}else if(arr[index]<arr[R]) {
swap(arr, index++, ++less);
}else {
swap(arr, index, --more);
}
}
swap(arr,more,R);
return new int[] {less+1,more};
}