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

news2024/10/7 2:25:45

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 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”这个表达通常用来比喻一种理想化的排序算法。

(完)

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

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

相关文章

ChatGPT高效提问—prompt常见用法(续篇十)

ChatGPT高效提问—prompt常见用法(续篇十) 1.1 使用引导词 ​ 除了利用prompt引导ChatGPT回答问题,另一种重要的应用场景是让ChatGPT根据需求生成各种内容,比如诗词创作、故事续写、招聘信息编写,甚至是舞台剧剧本创作等。在这些场景中,我们可以采取一个巧妙的策略,那…

使用deepspeed继续训练LLAMA

目录 1. 数据训练配置 2. 模型载入 3. 优化器设置 4. DeepSpeed 设置 5. DeepSpeed 初始化 6. 模型训练 LLAMA 模型子结构&#xff1a; 1. 数据训练配置 利用 PyTorch 和 Transformers 库创建数据加载器&#xff0c;它支持单机或多机分布式训练环境下的数据加载与采样。涉…

C# CAD交互界面-自定义面板集-添加快捷命令(五)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System; using System.Drawing; using System.Windows.Forms; 二、代码说明 [CommandMethod("Cre…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表&#xff1a; 首先要明白是如何用数组实现&#xff0c; 在这里需要用到几个数组&#xff0c;head表示头节点的下标&#xff0c;e[i]表示表示下标为i的值&#xff0c;ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

qt-C++笔记之判断一个QLabel上有没有load图片

qt-C笔记之判断一个QLabel上有没有load图片 code review! 在Qt框架中&#xff0c;QLabel是用来显示文本或者图片的一个控件。如果你想判断一个QLabel控件上是否加载了图片&#xff0c;你可以检查它的pixmap属性。pixmap属性会返回一个QPixmap对象&#xff0c;如果没有图片被加…

MATLAB知识点: ismember函数 判断数组A中的元素是否在数组B中

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.4.5 集合运算 h ismember(A, B)可以判断数组…

单片机在物联网中的应用

单片机&#xff0c;这个小巧的电子设备&#xff0c;可能听起来有点技术性&#xff0c;但它实际上是物联网世界中的一个超级英雄。简单来说&#xff0c;单片机就像是各种智能设备的大脑&#xff0c;它能让设备“思考”和“行动”。由于其体积小、成本低、功耗低、易于编程等特点…

GEE数据集——美国地质调查局历史地形图(更新)

美国地质调查局历史地形图 美国地质调查局地形图的历史可追溯到 19 世纪末&#xff0c;当时美国地质调查局开始着手绘制整个美国的详细地图。1:24,000 比例尺&#xff0c;也称为 7.5 分钟四边形地图&#xff0c;成为最广泛使用的比例尺之一。每张地图覆盖 7.5 分经纬度的区域&a…

第70讲axios后端请求工具类封装

axios工具类封装&#xff1a; // 引入axios import axios from axios;// 创建axios实例 const httpService axios.create({// url前缀-http:xxx.xxx// baseURL: process.env.BASE_API, // 需自定义baseURL:http://localhost:80/,// 请求超时时间timeout: 3000 // 需自定义 })…

vue+springboot前后端视频文件等的上传与展示(基于七牛云)

前言&#xff1a;在初步说明完成功能之前&#xff0c;我会把重要的部分说明下。后续我会细化。 vue视频文件上传 其实这里和图片这些文件就是一样的。因为上传只是把我们想在云端展示的文件按等传输到云端的bucket。然后方便网站去请求引用。 有人问我我就说明下。这种东西无…

【设计模式】23中设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

文件包含漏洞的应用与绕过技巧、防御方法

目录 包含日志文件 包含session 绕过技巧 指定前缀绕过 一、目录遍历 二、编码绕过 指定后缀绕过 一、利用URL 二、利用协议 三、长度截断 四、%00截断 文件包含漏洞防御 上一篇文章和大家介绍了一下文件包含漏洞和PHP伪协议的基本知识和利用PHP伪协议进行文件包含…

js中bind、call、apply 区别(如何实现)

文章目录 一、作用二、区别applycallbind小结 三、实现 一、作用 call、apply、bind作用是改变函数执行时的上下文&#xff0c;简而言之就是改变函数运行时的this指向 那么什么情况下需要改变this的指向呢&#xff1f;下面举个例子 var name "lucy"; var obj {n…

【EAI 013】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning

论文标题&#xff1a;BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning 论文作者&#xff1a;Eric Jang, Alex Irpan, Mohi Khansari, Daniel Kappler, Frederik Ebert, Corey Lynch, Sergey Levine, Chelsea Finn 论文原文&#xff1a;https://arxiv.org…

相机图像质量研究(11)常见问题总结:光学结构对成像的影响--像差

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

linux系统定时任务管理

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

解放双手!ChatGPT助力编写JAVA框架!

摘要 本文介绍了使用 ChatGPT逐步创建 一个简单的Java框架&#xff0c;包括构思、交流、深入优化、逐步完善和性能测试等步骤。 亲爱的Javaer们&#xff0c;在平时编码的过程中&#xff0c;你是否曾想过编写一个Java框架去为开发提效&#xff1f;但是要么编写框架时感觉无从下…

中科大计网学习记录笔记(八):FTP | EMail

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

svg基础(七)滤镜-feflood,feDisplacementMap 位置替换滤镜

1 feflood 此过滤器创建一个矩形&#xff0c;其中填充了指定的的颜色&#xff0c;应用了不透明度值。 1.1 语法 <feFlood x"" y"" width"" height"" flood-color"" flood-opacity""/>1.2 属性 x&#x…

fast.ai 深度学习笔记(一)

深度学习 2&#xff1a;第 1 部分第 1 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-1-602f73869197 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…