随机取基准
思想:取待排序列中任意一个元素作为基准
引入的原因:在待排序序列是不分有序时,固定选取基准是快排效率低下,要换届这种情况,就引入了随机选取基准
package sort;
//随机取基准
import java.util.Arrays;
import java.util.Random;
public class TestQuickSort2 {
//找到序列的基准并返回基准的下标
public static int partion(int []array,int low,int hign){
int tmp=array[low];
while(low<hign){
while(low<hign&&array[hign]>=tmp){
--hign;
}
if(low>=hign){
break;
}else{
array[low]=array[hign];
}
while(low<hign&&array[low]<=tmp){
++low;
}
if(low>=hign){
break;
}else{
array[hign]=array[low];
}
}
array[low]=tmp;
return low;
}
//利用swap方法将随机的基准对应的数与首位置对应的数互换
public static void swap(int[]array,int start,int end){
int tmp=array[start];
array[start]=array[end];
array[end]=tmp;
}
//采用递归的方法再对基准左右边进行快排
public static void Quick(int[]array,int start,int end){
//swap(array,start,(int)Math.random()%(end-start+1)+start);
Random rand=new Random();
int randNumber=rand.nextInt(end-start+1)+start;//产生基准的随机数
swap(array,start,randNumber);
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 QuickSort2(int[]array){
Quick(array,0,array.length-1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[]array={1,4,6,7,6,6,7,6,8,6};
QuickSort2(array);
System.out.println(Arrays.toString(array));
}
}