思想:基本的快速排序选取第一个或者最后一个元素作为基准。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为基准。这种情况下虽然最坏情况仍然是O(n2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。
/**
* @Author BoYou
* @Description 随机选取的快排
* @Date 2019/1/10 0010
*/
public class FastSort03 {
public static void main(String[] args) {
Random ran=new Random();
int[] array=new int[100];
for (int i = 0; i <100 ; i++) {
array[i] = ran.nextInt(100)+1;
}
quicksort(array);
System.out.println(Arrays.toString(array));
}
public static void quicksort(int[] array){
quick(array,0,array.length-1);
}
public static void quick(int[] array,int low,int high){
Random ran=new Random();
int sc=ran.nextInt(high-low)+1+low;
swap(array,sc,low);
int par=parvion(array,low,high);
if (par>low+1){
quick(array,low,par-1);
}
if (par<high-1){
quick(array,par+1,high);
}
}
public static void swap(int[] array,int a,int b){
int tmp=array[a];
array[a]=array[b];
array[b]=tmp;
}
public static int parvion(int[] array,int low,int high){
int tmp=array[low];
while (low<high){
while (low<high&&tmp<array[high]){
high--;
}
if (low<high){
array[low]=array[high];
low++;
}else break;
while (low<high&&tmp>array[low]){
low++;
}
if (low<high){
array[high]=array[low];
high--;
}else break;
}
array[low]=tmp;
return low;
}
}