三点中值法
选主元三点中值法左,中,右,三个位置,取中间值作为主元,与第一个元素交换
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,再快排中直接调取插入排序即可