【Algorithms 4】算法(第4版)学习笔记 06 - 2.3 快速排序

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:基本算法
      • 1.1:快速排序 demo 演示
      • 1.2:快速排序切分代码实现
      • 1.3:实现细节
      • 1.4:案例分析
      • 1.4.1:最佳案例
      • 1.4.2:最坏案例
      • 1.4.3:平均案例分析
      • 1.5:特征总结
      • 1.6:算法优化
      • 2:Dijkstra 三向切分的快速排序
      • 2.1:三向切分 demo 演示
      • 2.2:三向切分代码实现
      • 2.3:熵最优
      • 3:排序算法小总结

前言

本章节主要内容是 快速排序。快速排序被誉为二十世纪十大算法之一,至今也十分常用。

本文的主要内容包括 快速排序 以及 三向切分快速排序,视频课程中还有关于快速选择(quick selection)以及计算机系统应用的一些说明,本文不详细展开,感兴趣的朋友建议移步视频自行学习总结。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《2.3 快速排序》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。

1:基本算法

快速排序的递归是在它完成工作之后,而归并排序是在它完成工作之前。

基本过程:

  • 数组随机洗牌
  • 用一些 j 分割数组:
    • a[j] 在数组中
    • j 左边都是比它小的数
    • j 右边都是比它大的数

(对每一部分进行递归排序)

(截图自官网)
在这里插入图片描述

1.1:快速排序 demo 演示

在这里插入图片描述

阶段一:重复扫描直到指针 i 和 j 交叉。

  • i 指针从左到右扫描,只要 a[i] < a[lo]
  • j 指针从右到左扫描,只要 a[j] > a[lo]
  • 交换 a[i] 和 a[j]

阶段二:当指针i和j交叉后

  • 交换 a[lo] 和 a[j]

在这里插入图片描述

阶段二之后实际上就分区结束了。

(截图自官网)
在这里插入图片描述

切分轨迹:

(截图自官网)
在这里插入图片描述

1.2:快速排序切分代码实现

edu.princeton.cs.algs4.Quick#partition

在这里插入图片描述

edu.princeton.cs.algs4.Quick#sort

在这里插入图片描述

1.3:实现细节

(这里列出对应的章节)

  • 2.3.1.1 原地切分
  • 2.3.1.2 别越界
  • 2.3.1.3 保持随机性
  • 2.3.1.4 终止循环
  • 2.3.1.5 处理切分元素值有重复的情况
  • 2.3.1.6 终止递归

官网上也作了简单的说明:

(截图自官网)
在这里插入图片描述

1.4:案例分析

1.4.1:最佳案例

在这里插入图片描述

1.4.2:最坏案例

在这里插入图片描述

1.4.3:平均案例分析

这一环节,教授对于快速排序的分析作了数学模型的证明,对应了书本的命题 K。

命题K。将长度为N的无重复数组排序,快速排序平均需要~2NlnN次比较(以及1/6的交换)。

书本和教授视频里面都给出了相关的证明过程,不过说实话数学不好真的有点伤脑筋,我花了一点时间去搞懂证明过程。

先列举一下教授视频里面的证明过程:

在这里插入图片描述


在这里插入图片描述

特别是最后两步的近似过程,一开始一脸懵逼……

然后后面多亏了在线计算器,大致证明过程如下(iPad 写得比较丑,凑合看):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

其中:
在这里插入图片描述

(https://mathdf.com/int/cn/)

在这里插入图片描述

(https://www.lddgo.net/math/logarithm-calculator)

1.5:特征总结

在这里插入图片描述

简单翻译一下:

最坏的情况:比较次数是平方级别
(不过你的电脑被闪电击中的可能性更大,可以参见命题L证明)

一般情况:比较数为 ~ 1.39NlgN

  • 比较次数比归并排序多39%
  • 但是实际上比归并排序更快,因为数据移动少

随机洗牌:

  • 最坏情况下的概率保证
  • 基本数学模型可以通过实验验证

需要注意。实际上很多教科书上的实现是平方级别的,假如数组:

  • 进行排序或反向排序
  • 有许多重复项(即使是随机的!)

在这里插入图片描述

快速排序是原地排序算法。

  • 切分:恒定的额外空间
  • 递归深度:对数额外空间(大概率)
    (可以通过在较小的子数组上递归到较大的子数组来保证对数深度)

快速排序是不稳定的。

1.6:算法优化

  • 2.3.3.1 切换到插入排序
  • 2.3.3.2 三取样切分
  • 2.3.3.3 熵最优的排序

在这里插入图片描述


在这里插入图片描述

2:Dijkstra 三向切分的快速排序

前面总结有提及到:如果有很多重复项的时候,快速排序会很慢。因而有了三向切分的优化方式。

(截图自官网)
在这里插入图片描述

在这里插入图片描述

2.1:三向切分 demo 演示

初始数组:

在这里插入图片描述

情况一:a[i] < v

在这里插入图片描述

情况二:a[i] > v

在这里插入图片描述

情况三:a[i] = v

在这里插入图片描述

分割完成:

在这里插入图片描述

切分轨迹:

(截图自官网)
在这里插入图片描述

2.2:三向切分代码实现

教授:amazingly simple

edu.princeton.cs.algs4.Quick3way#sort

在这里插入图片描述

2.3:熵最优

在这里插入图片描述
(熵最优的证明超出了课程范围)

3:排序算法小总结

对于前面的六种算法作了简单总结:

在这里插入图片描述

做成表格简单翻译一下:

原地?稳定?最坏平均最好备注
选择排序N2/2N2/2N2/2N次交换
插入排序N2/2N2/4NN较小或者是部分排序时使用
希尔排序??N编码紧凑,次平方时间复杂度
次平方:指其运行时间的增长速度低于问题规模(通常是输入大小)的平方
归并排序NlgNNlgNNlgNNlogN保证,稳定
快速排序N2/22NlnNNlgNNlogN概率保证,在实践中最快
三向切分快速排序N2/22NlnNN改进存在重复键时的快排
???NlgNNlgNNlgN排序的圣杯
在计算机编程中,“Holy Sorting Grail”这个表达通常用来比喻一种理想化的排序算法。

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从Kafka系统中读取消息数据——消费

从Kafka系统中读取消息数据——消费 消费 Kafka 集群中的主题消息检查消费者是不是单线程主题如何自动获取分区和手动分配分区subscribe实现订阅&#xff08;自动获取分区&#xff09;assign&#xff08;手动分配分区&#xff09; 反序列化主题消息反序列化一个类.演示 Kafka 自…

大模型学习 一

https://www.bilibili.com/video/BV1Kz4y1x7AK/?spm_id_from333.337.search-card.all.click GPU 计算单元多 并行计算能力强 指数更重要 A100 80G V100 A100 海外 100元/时 单卡 多卡并行&#xff1a; 单机多卡 模型并行 有资源的浪费 反向传播 反向传播&#xff08;B…

通过遵循最佳做法来提高 EDA 和 HPC 应用程序的 Azure NetApp 文件性能

介绍 Azure NetApp 文件是一项托管存储解决方案&#xff0c;适用于各种方案&#xff0c;包括高性能计算 (HPC) 基础结构。 低延迟和每秒高 I/O 操作数 (IOPS) 对于大规模企业而言是一种很好的组合。 假设你就职于一家半导体公司。 你的任务是设计公司的集成电路芯片&#xff…

Ajax+JSON学习一

AjaxJSON学习一 文章目录 前言一、Ajax简介1.1. Ajax基础1.2. 同源策略 二、Ajax的核心技术2.1. XMLHttpRequest 类2.2. open指定请求2.3. setRequestHeader 设置请求头2.4. send发送请求主体2.5. Ajax取得响应 总结 前言 一、Ajax简介 1.1. Ajax基础 Ajax 的全称是 Asynchron…

【项目问题解决】java. net.SocketException: Connection reset

目录 【项目问题解决】java. net.SocketException: Connection reset 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 通过JMeter 压测接口&#xff0c;无并发&#xff0c;无间歇时间跑接口10000次报错&#xff0c;后续改成建个…

DBdoctor恭祝大家龙行龘龘,前程朤朤

值此新年之际&#xff0c;DBdoctor恭祝大家龙行龘龘&#xff0c;前程朤朤。尤其是当前还跟我一样奋斗在护航春节一线的战友们&#xff0c;祝愿大家2024年系统又快又稳。 今年是DBdoctor护航春晚的第三年&#xff0c;聚好看作为海信旗下的互联网科技公司&#xff0c;服务着海信…

再识C语言 DAY17 【什么是原码、反码和补码】

文章目录 前言本文总结于此文章 一、知识补充二、原码三、反码四&#xff0c;补码 总结如果您发现文章有错误请与我留言&#xff0c;感谢 前言 本文总结于此文章 一、知识补充 通常&#xff0c;1字节包含8位。C语言用字节&#xff08;byte&#xff09;表示储存系统字符集所需…

导入jar包的办法,若Maven报日志错误,Cannnot resolve XXXXX.jar

相信很多人在进行涉及到java工程项目&#xff0c;都会遇到很多问题&#xff0c;在pom文件中导入jar包&#xff0c;或许会出现cannot resolve XXXXX的问题&#xff0c;从而会报个别的错误。 接下来我将介绍两种导入jar包的方法 导入jar包&#xff0c;从官网直接下载下来相关的…

国产光耦2024:发展机遇与挑战全面解析

随着科技的不断进步&#xff0c;国产光耦在2024年正面临着前所未有的机遇与挑战。本文将深入分析国产光耦行业的发展现状&#xff0c;揭示其在技术创新、市场需求等方面的机遇和挑战。 国产光耦技术创新的机遇&#xff1a; 国产光耦作为光电器件的重要组成部分&#xff0c;其技…

Flume安装部署

安装部署 安装包连接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1m0d5O3Q2eH14BpWsGGfbLw?pwd6666 &#xff08;1&#xff09;将apache-flume-1.10.1-bin.tar.gz上传到linux的/opt/software目录下 &#xff08;2&#xff09;解压apache-flume-1.10.1-bin.tar.gz…

mysql 中文编码问题

前言 最近在学springboot整合mybatisplus技术&#xff0c;用到mysql数据库&#xff0c;然后发现在windows下插入数据表会出现中文乱码现象 (例如 “我是谁” 在数据库中就成了 “???”) windows show variables like %char%;建表时, 设置默认charset为gbk create table u…

linux系统定时任务管理

crontab使用 一、crontab简介 crontab 这个指令所设置的工作将会循环的一直进行下去&#xff01;可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外&#xff0c;亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服…

InternLM大模型实战-1.书生浦语大模型全链路开源体系

文章目录 前言笔记正文大模型成为热门关键词书生浦语开源历程从模型到应用书生浦语全链条开源开放体系数据预训练微调评测部署部署智能体LagentAgentLego 总结 前言 本系列文章是参与书生浦语全链路开源体系学习的笔记文章。B站视频教程地址&#xff1a; 笔记正文 大模型成为…

【玩转408数据结构】线性表——定义和基本操作

考点剖析 线性表是算法题命题的重点&#xff0c;该类题目实现相对容易且代码量不高&#xff0c;但需要最优的性能&#xff08;也就是其时间复杂度以及空间复杂度最优&#xff09;&#xff0c;这样才可以获得满分。所以在考研复习中&#xff0c;我们需要掌握线性表的基本操作&am…

vue3集成bpmn

文章目录 前言一、依赖二、汉化配置1.引入文件2.样式文件 总结 前言 vue3 集成bpmn 配置工作流 一、依赖 "bpmn-js": "^7.3.1", "bpmn-js-properties-panel": "^0.37.2", "bpmn-moddle": "^6.0.0", "camu…

MySQL 主键策略导致的效率性能

MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment 一、准备三张表 分别是user_auto_key&#xff0c;user_uuid&#xff0c;user_random_key&#xff0c;分别表示自动增长的主键…

深度学习自然语言处理(NLP)模型BERT:从理论到Pytorch实战

文章目录 深度学习自然语言处理&#xff08;NLP&#xff09;模型BERT&#xff1a;从理论到Pytorch实战一、引言传统NLP技术概览规则和模式匹配基于统计的方法词嵌入和分布式表示循环神经网络&#xff08;RNN&#xff09;与长短时记忆网络&#xff08;LSTM&#xff09;Transform…

从模型到前端,你应该知道的LLM生态系统指南

LLM在在2023年发展的风生水起&#xff0c;一个围绕LLM的庞大生态系统正在形成&#xff0c;本文通过介绍这个生态系统的核心组成部分&#xff0c;来详细整理LLM的发展。 模型-核心组件 大型语言模型(llm)是人工智能应用程序背后的原材料。这些模型最初被预先训练来预测句子中的…

基于YOLOv7算法的高精度实时老鼠目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算的高精度实时老鼠目标检测系统可用于日常生活中检测与定位老鼠目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数据…

每日一练:LeeCode-113、路径总和 II【二叉树+DFS+回溯+是否有返回值】

本文是力扣LeeCode-113、路径总和 II【二叉树DFS回溯是否有返回值】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c; 找出所有从根节点到叶子节点路径总…