算法|5.快速排序相关

news2024/11/26 20:44:44

算法|5.快速排序相关

1.荷兰国旗问题

题意:给定一个数组arr,以arr[R]为划分值,请把arr[R]的数放在数组的左边,等于arr[R]的数放在数组的中间,大于arr[R]的数放在数组的右边,返回等于arr[R]的区间。要求额外空间复杂度为O(1),时间复杂度为O(n)

解题思路:

  • 根据L和R的关系分三种情况讨论:L>R;L==R;L<R
  • L>R==>{-1,-1} LR>{L,R}
  • L<R: <区域右边界——less,>区域左边界——more,遍历指针index
  • 循环条件index<more(小于>区域右边界):若arr[index]和arr[R]相等,index++;若arr[index]<arr[R],index位置和++less位置交换<区域右扩,指针加加;若arr[index]>arr[R],index位置和–more位置交换
  • 注意:<时index–和++less(已经检验过了,等于的或者当前的),>时–more和index交换

核心代码:

public static int[] netherlandsFlag(int[] arr,int L,int R){
    if(L>R){
        return new int[]{-1,-1};
    }
    if(L==R){
        return new int[]{L,R};
    }
    int less=L-1;
    int more=R;
    int index=L;
    while(index<more){
        if(arr[index]==arr[R]){
            index++;
        }else if(arr[index]<arr[R]){
            swap(arr,index++,++less);
        }else{
            swap(arr,index,--more);
        }
    }
    swap(arr,R,more);
    return new int[]{less+1,more};
}

private static void swap(int[] arr, int i, int j) {
    int tmp=arr[i];
    arr[i]=arr[j];
    arr[j]=tmp;
}

测试代码:

//for test
public static void main(String[] args) {
    int[] arr={100,2,37,8,96,4,2,6,7,9,3,45};
    int[] partition=netherlandsFlag(arr,0,arr.length-1);
    System.out.println("划分:"+ Arrays.toString(partition));
    System.out.println(Arrays.toString(arr));
}

测试结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z6GMDgu6-1685106795384)(F:\typora插图\image-20230526203747202.png)]

2.快速排序3.0

经典版本:小于指定值的放在左边,大于的放右边

递归实现:

//递归方式
public static void quickSort1(int[] arr){
    if(arr==null||arr.length<2){
        return ;
    }
    process(arr,0,arr.length-1);
}

private static void process(int[] arr, int L, int R) {
    if(L>=R){
        return ;
    }
    //快速排序的优化手段之一——破坏可能存在的完全逆序
    swap(arr, (int) (L+Math.random()*(R-L+1)),R);//L~(R-L)-1
    int[] equalArea=netherlandsFlag(arr,L,R);
    process(arr,L,equalArea[0]-1);
    process(arr,equalArea[1]+1,R );
}

public static int[] netherlandsFlag(int[] arr,int L,int R){
    if(L>R){
        return new int[]{-1,-1};
    }
    if(L==R){
        return new int[]{L,R};
    }
    int less=L-1;
    int more=R;
    int index=L;
    while(index<more){
        if(arr[index]==arr[R]){
            index++;
        }else if(arr[index]<arr[R]){
            swap(arr,index++,++less);
        }else{
            swap(arr,index,--more);
        }
    }
    swap(arr,R,more);
    return new int[]{less+1,more};
}

private static void swap(int[] arr, int i, int j) {
    int tmp=arr[i];
    arr[i]=arr[j];
    arr[j]=tmp;
}

非递归实现:

//非递归方式
public static class Op{
    public int l;
    public int r;

    public Op(int l, int r) {
        this.l = l;
        this.r = r;
    }
}
//顺序调整过程在荷兰国旗内部
public static void quickSort2(int[] arr){
    if(arr==null||arr.length<2){
        return ;
    }
    int N=arr.length;
    swap(arr, (int) (Math.random()*N),N-1);//L~(R-L)-1
    int[] equalArea=netherlandsFlag(arr,0,N-1);
    Stack<Op> stack=new Stack<>();
    stack.push(new Op(0,equalArea[0]-1));
    stack.push(new Op(equalArea[1]+1,N-1));
    while(!stack.isEmpty()){
        Op op=stack.pop();
        if(op.l<op.r){
            swap(arr,op.l+ (int) (Math.random() * (op.r - op.l + 1)), op.r);
            equalArea=netherlandsFlag(arr,op.l, op.r);
            stack.push(new Op(op.l,equalArea[0]-1));
            stack.push(new Op(equalArea[1]+1,op.r ));
        }
    }
}

//荷兰国旗
public static int[] netherlandsFlag(int[] arr,int L,int R){
    if(L>R){
        return new int[]{-1,-1};
    }
    if(L==R){
        return new int[]{L,R};
    }
    int less=L-1;
    int more=R;
    int index=L;
    while(index<more){
        if(arr[index]==arr[R]){
            index++;
        }else if(arr[index]<arr[R]){
            swap(arr,index++,++less);
        }else{
            swap(arr,index,--more);
        }
    }
    swap(arr,R,more);
    return new int[]{less+1,more};
}

private static void swap(int[] arr, int i, int j) {
    int tmp=arr[i];
    arr[i]=arr[j];
    arr[j]=tmp;
}

测试代码:

​ isEqual

测试结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4oiDoLUt-1685106795385)(F:\typora插图\image-20230526205807883.png)]

快速排序算法总结

算法描述:

复杂度分析及评价指标:

  • 时间复杂度:平均/最好:O(nlogn)
  • 空间复杂度:平均最好:O(nlogn)
  • 证明忽略
  • 不稳定

划分:

  • 荷兰国旗——大于区左扩,小于区右扩,三个index调整

例题总结:

  • 荷兰国旗总结:大于区左扩,小于区右扩,index<more,swap(arr,index++,++less),swap(arr,index,--more);
  • 快速排序递归实现:荷兰国旗替代M;优化破坏完全逆序结构: swap(arr, (int) (L+Math.random()*(R-L+1)),R);//L~(R-L)-1
    process(arr,L,equalArea[0]-1); process(arr,equalArea[1]+1,R );
  • 快速排序非递归实现:new Op(op.l,op.r); if(op.l<op.r){ swap(arr,op.l+ (int) (Math.random() * (op.r - op.l + 1)), op.r); equalArea=netherlandsFlag(arr,op.l, op.r); stack.push(new Op(op.l,equalArea[0]-1)); stack.push(new Op(equalArea[1]+1,op.r )); th.random() * (op.r - op.l + 1)), op.r);
    equalArea=netherlandsFlag(arr,op.l, op.r);
    stack.push(new Op(op.l,equalArea[0]-1));
    stack.push(new Op(equalArea[1]+1,op.r ));
    }`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSP432笔记8:定时器A_PWM驱动舵机

开发板型号&#xff1a;MSP432P401r 今日得以继续我的MSP432电赛速通之路&#xff0c;文首提供本次学习实践项目文件。 注&#xff1a;我笔记实践都是从原始空项目工程文件开始配置的。 有道是 —_—_—_—_— “山无重数周遭碧&#xff0c;花不知名分外娇” “曲…

Linux驱动入门(三)——源码下载阅读、分析和嵌入式文件系统介绍

文章目录 从内核出发获取内核源码使用Git安装内核源码使用补丁 阅读Linux内核源码Source Insight简介阅读源码 内核开发的特点无libc库抑或无标准头文件GNU C没有内存保护机制不要轻易在内核中使用浮点数容积小而固定的栈同步和并发可移植性的重要性 Linux源码分析Linux源码结构…

每日一题——用两个队列实现栈

每日一题 用两个队列实现栈 题目链接 思路 这里主要讲怎么实现出栈StackPop操作做完用两个栈实现队列&#xff0c;我们可能会想当然的认为&#xff0c;这一题也是一个主队列&#xff0c;一个辅助队列&#xff0c;当要出队时&#xff0c;首先判断辅助队列是否为空&#xff0c;…

代码线程安全

线程生命周期 synchronized synchronized会自动释放锁 synchronized同步代码块 synchronized后面括号里obj是锁对象(保证唯一)&#xff1b;static修饰的obj对象是自定义MyThread线程类的静态成员变量&#xff0c;该自定义线程类所有实例共享保证锁对象唯一性&#xff1b;另一…

广度优先搜索

注&#xff1a;最近有些事所以请大家原谅 那么废话讲完了┏ (゜ω゜)☞ 目录 一&#xff1a;认识广搜 广度优先搜索算法的搜索步骤一般是&#xff1a; 二&#xff1a;导入 广度优先搜索一般可以回答两类问题&#xff1a; 三&#xff1a;基础应用 例题1&#xff1a;寻宝…

Electron 入门案例详解

目录 前言一、开发环境检查二、入门案例实现1.初始化项目2.安装electron包3.运行electron应用 三、创建第一个应用窗口1.准备页面2.创建窗口3.运行窗口 总结 前言 Electron 是一种基于 Node.js 和 Chromium 的框架&#xff0c;可以方便地创建跨平台的桌面应用程序。虽然 Elect…

jlink-v8刷固件及解决keil报错 j-link is defective,j-link clone

今天在调试STM32F407的程序时&#xff0c;下载程序时突然keil识别不到jlink了&#xff0c;还以为是驱动的问题&#xff0c;重新装了好几次驱动&#xff0c;结果还是不行&#xff0c;于是就网上找各种办法&#xff0c;最后决定重新刷固件。网上的方法很多&#xff0c;好多都失败…

Kotlin Compose Multiplatform 跨平台(Android端、桌面端)开发实践之使用 SQLDelight 将数据储存至数据库

前言 关于标题和文章主题 取标题的时候我还在想&#xff0c;我应该写 Compose 跨平台呢还是写 Kotlin 跨平台。 毕竟对于我的整体项目而言&#xff0c;确实是 Compose 跨平台开发&#xff0c;但是对于我这篇文章要说的东西&#xff0c;那其实也涉及不到多少 Compose 相关的内…

力扣sql中等篇练习(二十七)

力扣sql中等篇练习(二十七) 1 连续两年有3个及以上订单的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below WITH T as (SELECT t.product_id,t.d,count(order_id) numFROM(SELECT order_id,product_id,…

es elasticsearch 九 索引index 定制分词器 type结构后期弃用原因 定制动态映射 动态映射模板 零停机重建索引

目录 索引index 定制分词器 Type底层结构及弃用原因 定制 dynamic mapping 定制dynamic mapping template 动态映射模板 零停机重建索引 生产环境应该度别名数据 索引index Put /index Stings 分片 Mapping 映射 Aliases 别名 增加 Put my_index2 { "se…

网络安全行业在经济下行期仍然稳步增长,快抓住风口入行

根据IDC《2022年第四季度中国IT安全软件市场跟踪报告》的数据&#xff0c;2022年下半年中国IT安全软件市场厂商整体收入约为23.8亿美元&#xff08;约合165.7亿元人民币&#xff09;&#xff0c;同比上升12.4%。结合全年数据&#xff0c;2022全年中国IT安全软件市场规模达到39.…

NodeJS 文件操作④

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言NODE内置模块 FS模块 CallBack API mkdir &#xff08;创建文件夹 异步&#xff09; rmdir&#xff08;删除文件夹 异步&#xff09; rm&#…

百度爱番番的线索如何自动导入至CRM系统中?

百度爱番番是什么&#xff1f; 百度爱番番是应用百度强大AI能力&#xff0c;帮助企业实现营销数字化、自动化、智能化&#xff0c;为企业提供拓客、集客、管客的一站式智能解决方案&#xff0c;助力企业营销变得专业且智能。 百度爱番番的线索如何自动导入至CRM系统中&#xf…

MKS SERVO4257D 闭环步进电机_系列2 菜单说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

数据结构和算法,在Python中的实现方式

部分数据来源&#xff1a;ChatGPT 数据结构 在计算机科学中&#xff0c;数据结构指的是计算机中用来存储和组织数据的方式。数据结构是为算法服务的&#xff0c;同一个算法在不同的数据结构上运行效率可能会有很大的不同。这就要求我们在解决问题时要根据具体情况选择合适的数…

前端中间件Midway的使用

一、 关于midway1. 解决什么痛点2. 期望达到什么效果 二、创建应用并使用1. 创建midway应用2. 认识Midway2.1 目录结构2.2 Controller2.3 路由2.4 获取请求参数2.5 Web中间件2.6 组件使用2.7 服务(service) 三、写到最后 一、 关于midway Midway 是阿里巴巴 - 淘宝前端架构团队…

别做重复低质的工作内容摸鱼了,18k大佬分享自动化测试秘籍

自动化测试面试真题&#xff08;附答案&#xff09; 一、编程语法题 1、python有哪些数据类型 2、怎么将两个字典合并 3、python 如何将json写到文件里? 4、 __init__和_new__区别? 5、什么是可变、不可变类型&#xff1f; 6、mysql注入点&#xff0c;用工具对目标站直接写入…

IDEA操作数据库并设置时区

目录 设置mysql的时区的方法&#xff08;提供三种选择&#xff09; 1、直接在advanced上配置serverTimezone属性值&#xff08;单次连接有效&#xff09; 2、进入MySQL客户端修改time_zone 3、直接修改MySQL的my.ini配置文件设置time-zone 使用Database 1、查看当前数据源…

uCOSii信号量的作用

uCOSii中信号量的作用&#xff1a; 在创建信号量时&#xff0c;Sem_EventOSSemCreate(1)用于分时复用共享资源&#xff1b; Sem_EventOSSemCreate(0)用于中断和任务间同步或任务之间的同步。 具体在使用时&#xff0c;需要灵活运用。在访问共享资源时&#xff0c;我喜欢用互…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)

文章目录 一、检测相关(9篇)1.1 Energy-based Detection of Adverse Weather Effects in LiDAR Data1.2 Anomaly Detection with Conditioned Denoising Diffusion Models1.3 Mask Attack Detection Using Vascular-weighted Motion-robust rPPG Signals1.4 Improved Multi-Sca…