基本的快速排序选取第一个或者最后一个元素作为基准。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为基准。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。
public class Test1 {
public static void swap(int[] array,int start,int end){
int tmp = array[start];
array[start] = array[end];
array[end] = tmp;
}
/**
* 找基准
* @param array
* @param low
* @param high
* @return
*/
public static int partion(int[] array,int low,int high){
int tmp = array[low];
while(low<high){
//从high位置寻找比tmp小的值
while(low < high && array[high] >= tmp){
--high;
}
if(low >= high){
//表明low与high相遇
break;
}else{
array[low] = array[high];
}
//从low位置寻找比tmp大的值
while(low < high && array[low] <= tmp){
++low;
}
if(low >= high){
//表明low与high相遇
break;
}else{
array[high] = array[low];
}
}
array[low] = tmp;
return low;
}
public static void Quick(int[] array,int start,int end){
//产生随机数使防止元素集中
swap(array,start,(int)(Math.random()%(end-start)+start));
//找基准
int par = partion(array,start,end);
//对基准左边进行排序
if(par > start+1){
Quick(array, start, par-1);
}
//对基准右边进行排序
if(par < end-1){
Quick(array, par+1, end);
}
}
public static void QuickSort(int[] array){
Quick(array,0,array.length-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {45,12,46,5,13,47,2};
QuickSort(array);
System.out.println(Arrays.toString(array));
}
}