蓝桥杯算法基础(20):(快速排序的其他优化)java版

三点中值法

选主元

三点中值法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值