当前位置: 首页 > article >正文

蓝桥杯算法基础(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,再快排中直接调取插入排序即可

http://www.kler.cn/a/273744.html

相关文章:

  • 深入理解 C 语言中浮点型数据在内存中的存储
  • 【大数据基础】大数据概述
  • Elixir语言的学习路线
  • GitLab创建用户,设置访问SSH Key
  • Yolo11改进:注意力改进|Block改进|ESSAformer,用于高光谱图像超分辨率的高效Transformer|即插即用
  • C语言初阶习题【25】strcpy的模拟实现
  • IDEA中的Project工程、Module模块的概念及创建导入
  • c++复数计算器
  • 陪诊系统有什么方便之处
  • 初次文件包含漏洞
  • 关于相机与镜头的选型
  • 使用ansible剧本进行lvm分盘
  • phpStudy安装thinkCMF8时,如何解决服务器rewrite和APIrewrite不支持的问题
  • UGUI源码分析与研究1-UGUI底层的实现原理
  • Java后端面试:框架篇高频面试(Spring、SpringMVC、SpringBoot、MyBatis)
  • 【渗透工具】BurpSuite汉化无cmd框版安装教程
  • Flutter-自定义图片3D画廊
  • 蓝桥杯刷题总结(Python组)
  • 信雅纳网络测试的二次开发集成:XOA(Xena Open-Source Automation)开源自动化测试
  • 目标检测——YOLOv5算法解读
  • 高架学习笔记之信息系统分类概览
  • 比较两个数组对象,找出属性id相同的项并删除
  • P8711 [蓝桥杯 2020 省 B1] 整除序列 存疑解决篇 Python
  • 爬虫技术实战案例解析
  • Java基础知识总结(6)
  • 超分之SwinIR