版权声明:中华人民共和国持有版权 https://blog.csdn.net/Fly_Fly_Zhang/article/details/86140965
思想:基本的快速排序选取第一个或者最后一个元素作为基准。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为基准。这种情况下虽然最坏情况仍然是O(n2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。
实现代码如下:
class Test{
/*
* @Description : 一趟快速排序
* @param array
* @param low
* @param high
* @return : int
* @exception :
* @date : 2019/1/9 11:22
*/
public static int partion(int [] array,int low,int high){
int tmp=array[low];
while(low<high){
while(low<high && array[high]>tmp){
high--;
}
if(low>=high){
break;
}else{
array[low]=array[high];
}
while(low<high&&array[low]<tmp){
low++;
}
if(low>=high){
break;
}else{
array[high]=array[low];
}
}
array[low]=tmp;
return low;
}
public static void swap(int []array ,int low,int rand){
int tmp=array[low];
array[low]=array[rand];
array[rand]=tmp;
}
public static void quick(int [] array,int low,int high){
Random random=new Random();
int randNum=random.nextInt(high-low)+low+1; //low 和 high之间的所有随机数
swap(array,low,randNum);
int par=partion(array,low,high); //下一趟排序新的基准
if(par>low+1){
quick(array,low,par-1);
}
if(par<high-1){
quick(array,par+1,high);
}
}
public static void quickSort(int [] array){
quick(array,0,array.length-1);
}
public static void main(String [] args){
int array []=new int[10000];
Random random=new Random();
for(int i=0;i<array.length;i++){
array[i]=random.nextInt(10000)+1;
}
quickSort(array);
}
}