三点中值法
选主元
三点中值法
左,中,右,三个位置,取中间值作为主元,与第一个元素交换
public static int partition(int[] A,int p,int r){
int pivot=A[p];
//优化,在p,r,mid之间,选一个中间作为主元
int midIndex=p+((r-p)<<1);//中间下标
int midValueIndex=-1;//中值的下标
if(A[p]<=A[midIndex]&&A[p]>=A[r]){
midValueIndex=p;
}else if(A[r]<A[midIndex]&&A[r]>=A[p]){
midValueIndex=r;
}else{
midValueIndex=midIndex;
}
Util.swap(A,p,midValueIndex)//java中的交换方法
int pivot=A[p];
int left=p+1;
int right=r;
while(left<=right){
while(left<=right&&A[left]<=pivot)left++;
swap(left,right);
right--;
}
}
绝对中值法
//绝对中值:分组,每5个一组,最后一组可能不足5个,每组都排序然后取中间值,再在所有的中间值中再次取中值
//工程中不常用
//获取绝对的中值数,o(N)的样子
public static int getMedian(int[] arr,int p,int r){
int size=r-p+1;//数组长度
//每五个元素一组
int groupSize=(size%5==0)?(size/5):(size/5+1);//每五个一组,最后一组小于等于五
//存储各小组的中值
int medians[]=new int[groupSize];
int indexOfMedains=0;
//对每一组进行插入排序
for(int j=0;j<groupSize;j++){
//单独处理最后一组,因为最后一组可能不满5个元素
if(j==groupSize-1){
_3InsertionSort.sort(arr,p+j*5,r);//自己定义的包和sort方法,插入排序,排序最后一组
medians[indexOfMedians++]=arr[(p+j*5+r)/2];//最后一组的中间那个,对最后一组找中间值
}else{
_3InsertionSort.sort(arr,p+j*5,p+j*5+4);//排序非最后一组的某个组
medians[indexOfMedians++]=arr[p+j*5+2];//当数组排序后取5个元素里中间那个也就是第三个
}
}
//对medians排序
——3InsertionSort.Sort(medians,0,medians.length-1);
return medians[median.length/2];//排完序,在取中间值
}
待排序列表较短时,应插入排序
待排序个数小于等于8的时候,用插入排序
如果r-p+1<=8,再快排中直接调取插入排序即可