数据结构和算法-交换排序中的快速排序(演示过程 算法实现 算法效率 稳定性)

文章目录

  • 总览
  • 快速排序(超级重要)
  • 啥是快速排序
  • 演示过程
  • 算法实现
    • 第一次quicksort函数
    • 第一次partion函数
    • 到第一次quicksort的第一个quicksort
    • 到第二次quicksort的第一个quicksort
    • 到第二次quicksort的第二个quicksort
    • 到第一次quicksort的第二个quicksort
    • 到第一次quicksort的第二个quicksort的partition
    • 到第一次quicksort的第二个quicksort的第一个quicksort
    • 到第一次quicksort的第二个quicksort的第一个quicksort的partition函数
    • 到第一次quicksort的第二个quicksort的第一个quicksort的第一个quicksort函数
    • 到第一次quicksort的第二个quicksort的第一个quicksort的第二个quicksort函数
    • 到第一次quicksort的第二个quicksort的第二个quicksort
    • 第一次quicksort的第二个quicksort执行完
    • 第一个quicksort执行完
  • 算法效率分析
    • 最好的情况
    • 最坏的情况
    • 优化
    • 算法效率小结
  • 稳定性
  • 小结

总览

在这里插入图片描述

快速排序(超级重要)

啥是快速排序

在这里插入图片描述

演示过程

此时选49为枢轴元素,接着low和high往中间移动,并且保证,low左边都是小于枢轴元素,high元素右边都是大于枢轴元素
此时high位置的49大于等于49,high左移
在这里插入图片描述
此时high所指的元素为27小于49,所以将high位置的元素移动到low位置
在这里插入图片描述
移动后,high的位置空出来,此时移动low位置,此时low的位置的元素为27,小于49,low移动在这里插入图片描述
此时low位置的元素依然小于49,low移动
在这里插入图片描述
此时low指向的元素65大于49,移动到high位置
在这里插入图片描述
此时low位置空了,移动high位置,此时high位置的元素大于49,high左移
在这里插入图片描述
此时high位置元素13小于49,13移动到low位置,
在这里插入图片描述
此时high空,移动low,此时13小于49,low右移
在这里插入图片描述
此时97大于49,将97移动到high

在这里插入图片描述
此时移动high,97大于49,high左移
在这里插入图片描述
此时76大于49,high左移
在这里插入图片描述
low和high碰到一起,此时左右元素都扫了一遍了,比49都小的元素都放到low的左边了,比49大的元素都放high的右边,
在这里插入图片描述
然后把枢轴元素放到low和high重合的位置
在这里插入图片描述

接下来对分别对左右两个子表进行刚刚的过程
此时是左子表,high位置元素13小于27,移动到low
在这里插入图片描述
此时移动low,13小于27,low右移,
在这里插入图片描述
此时38大于27,38移到high
在这里插入图片描述
此时移动high,38大于27,high左移
在这里插入图片描述
此时high和low重合,27放入该位置
在这里插入图片描述
此时该子表又划分两个子表,此时两个子表都只有一个元素,此时不需要处理,因为此时low左边元素小于枢轴,high右边元素大于枢轴,又因为此时左右都只有一个元素,所以已经有序
在这里插入图片描述
此时要处理右子表,high所指元素49小于76,49移动到low,
在这里插入图片描述
此时49小于76,low右移动
在这里插入图片描述
此时97大于76,97移动到high
在这里插入图片描述
此时high移动,97大于76,high左移
在这里插入图片描述
65小于76,65移动到low
在这里插入图片描述
low移动,65小于76,low右移,
在这里插入图片描述
low和high碰头,76放入该位置
在这里插入图片描述
此时再次划分为两个子表,对左子表处理
此时65大于49,high左移

在这里插入图片描述
low和high碰头,49放该位置

在这里插入图片描述
此时由于65和97都只有一个元素,所以直接确定位置
最后排序结果
在这里插入图片描述

算法实现

在这里插入图片描述

首先调用QuickSor函数,开始对整个表划分,并调用partition函数,此时划分整个表

第一次quicksort函数

在这里插入图片描述

第一次partion函数

pivot就是枢轴的意思
此时partion函数大循环的条件是low<high,当low=high时将停止循环
此时大循环中还有两个循环,先是high位置开始的循环,然后是low开始的循环
发现49大于要枢轴值
high左移在这里插入图片描述
此时27小于枢轴值
跳出while循环,并将此时的high的值赋值给low位置
在这里插入图片描述
此时跳到下一个while循环,比较low位置的值和枢轴的值,如果low的值小于枢轴的值,此时low往后移动
在这里插入图片描述
此时直到65发现low的值大于枢轴的值,跳出循环
此时移动low位置的值到high位置上去,此时回到大循环,发现low<high,继续下一次大循环,但大循环仍然是在溢依次分表之中
在这里插入图片描述
此时继续开始第一次小循环,到13跳出第一次小循环,并将high位置的值给low位置的值

在这里插入图片描述
此时开始第二次小循环,到97跳出第二次小循环,并将low值给high位置的值,然后进入下次大循环
在这里插入图片描述
此时进入第一次小循环,此时当high移动到与low相同才跳出第一次小循环,此时由于low=high,第二次小循环也会跳出,随后大循环条件不满足了,跳出大循环
在这里插入图片描述
然后将枢轴元素放到low的位置,并return low的值那么就完成了一次划分的工作
此时quicksort函数中pivotpos的值为该次划分的枢轴的位置
在这里插入图片描述

到第一次quicksort的第一个quicksort

此时处理之前划分的左子表,从low到之前返回得到的枢轴的位置
在这里插入图片描述
此时函数执行过程与之前类似,此时partition函数返回27,返回到第二次quicksort函数中
在这里插入图片描述

到第二次quicksort的第一个quicksort

此时的low和high相等,直接跳出if语句
在这里插入图片描述

到第二次quicksort的第二个quicksort

此时low依然等于high,直接跳出if

在这里插入图片描述

到第一次quicksort的第二个quicksort

此时low=3+1=4,high=7
在这里插入图片描述

到第一次quicksort的第二个quicksort的partition

执行过程于之前相同
在这里插入图片描述
结果
在这里插入图片描述

到第一次quicksort的第二个quicksort的第一个quicksort

此时之前的partition返回到pivotpos为6
此时的quicksort处理的low为4,high为6-1=5
在这里插入图片描述

到第一次quicksort的第二个quicksort的第一个quicksort的partition函数

此时结果
在这里插入图片描述

到第一次quicksort的第二个quicksort的第一个quicksort的第一个quicksort函数

此时之前的partition返回的pivotpos为4
则第一个quicksort对呀的low和4,high为4-1=3
此时不满足low<high,跳出if语句
在这里插入图片描述

到第一次quicksort的第二个quicksort的第一个quicksort的第二个quicksort函数

此时low=4+1=5,high=5,不满足low<high,跳出if语句
在这里插入图片描述

到第一次quicksort的第二个quicksort的第二个quicksort

此时low=6+1=7,high=7,同样不满足low<high,会跳出if
在这里插入图片描述

第一次quicksort的第二个quicksort执行完

在这里插入图片描述

第一个quicksort执行完

排序完成
在这里插入图片描述

算法效率分析

函数每次先得到该范围的枢轴的位置,然后再以该枢轴为中级元素分开两个范围,对各个范围进行函数

partion函数需要通过low和high将该范围的数据都遍历一遍,因为终止条件是low=high
在这里插入图片描述
此时空间复杂度为调用过程中调用函数栈最多的时候
在这里插入图片描述
每层quicksort都是上一层quicksort分成的子表处理,每层处理都分成两个子表在这里插入图片描述
递归层数就是二叉树的层数
在这里插入图片描述

最好的情况

在这里插入图片描述

最坏的情况

在这里插入图片描述
此时high需要左移low才行,第一层quicksort处理后,第二层只需对右边部分处理
在这里插入图片描述
此时依然high需要移到low
在这里插入图片描述
第二层处理后,第三层只需对右边部分处理
在这里插入图片描述
按照这样,需要8层quicksort调用
如果是逆序,第一层quicksort后,ow移动到最右边的位置即high位置,第二层都只需要处理左边部分,,之后的处理类似
在这里插入图片描述

优化

即让枢轴的值极可能不要是最大值或最小值
在这里插入图片描述

算法效率小结

实际情况实际复杂度都接近于最好时间复杂度
在这里插入图片描述

稳定性

看这个例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
是不稳定的
在这里插入图片描述

小结

下图时间复杂度最好和最坏写反了
在这里插入图片描述

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

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

相关文章

Java反射和动态代理

文章目录 1、反射1.1 反射的概述1.2 反射作用1.3 获取字节码文件对象的方式1.4 字节码文件和字节码文件对象1.5 获取构造方法1.6 获取构造方法并创建对象1.7 获取成员变量并获取值和修改值1.8 获取成员方法1.9 获取成员方法并运行1.10 反射练习1.10.1 泛型擦除1.10.2 修改字符串…

uniapp 创建组件组件

组件&#xff1a;用于将某个功能的 HTML、CSS、JS 封装到一个文件中&#xff0c;提高代码的复用性和可维护性。 创建组件 一、在根目录中创建 components 文件夹&#xff0c;右键点击新建组件。 二、输入组件名称、选择默认模板、点击创建组件。 三、在组件中正常编写内容即可…

动态编译 - Dynamically Compile and Load External Java Classes

文章目录 概述Code 概述 动态编译和加载外部Java类的核心流程可以概括为以下几个步骤&#xff1a; 读取源代码: 首先&#xff0c;需要获取到外部的Java源代码。这通常是通过读取文件、网络资源或者数据库中的源代码字符串来实现的。编译源代码: 接下来&#xff0c;需要使用Ja…

计算机网络(8):因特网上的音频/视频服务

概述 计算机网络最初是为传送数据设计的。因特网 IP 层提供的 “尽最大努力交付” 服务以及每一个分组独立交付的策略&#xff0c;对传送数据信息十分合适。因特网使用的 TCP 协议可以很好地解决P层不能提供可靠交付这一问题。 音频/视频常称为多媒体信息 多媒体信息&#xff…

【BIAI】lecture 3 - GD BP CNN Hands-on

GD & BP & CNN & Hands-on 专业术语 gradient descent (GD) 梯度下降 back propagation (BP) 向传播 Convolutional Neural Network (CNN) 卷积神经网络 forward propagation 前向传播 biologically symmetry 生物对称性 synaptic 突触 axon 轴突 课程大纲 The go…

BUUCTF crypto做题记录(6)新手向

一、Unencode 得到的密文&#xff1a;89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM] 看题目名字&#xff0c;我们可以知道这是一个解码的题目&#xff0c;但是unencode 好像是不可解码的意思&#xff0c;我们可以对照着解码方式看一下哪个更适合&#xff0c;可以进行尝试一下C…

RocketMQ 投递消息方式以及消息体结构分析:Message、MessageQueueSelector

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

腾讯云取消免费10G CDN流量包:免费CDN时代结束

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 免费送了7-8年的腾讯云10G免费流量包&#xff0c;从2024年开始&#xff0c;停止赠送了!自此&#xff0c;国内绝大多数互联网大厂的CDN都开收费了! 大概从2016年开始&#xff0c;腾讯云为了抢夺CDN客户&#xff0…

基于Spring-boot-websocket的聊天应用开发总结

目录 1.概述 1.1 Websocket 1.2 STOMP 1.3 源码 2.Springboot集成WS 2.1 添加依赖 2.2 ws配置 2.2.1 WebSocketMessageBrokerConfigurer 2.2.2 ChatController 2.2.3 ChatInRoomController 2.2.4 ChatToUserController 2.3 前端聊天配置 2.3.1 index.html和main.j…

mnn-llm: 大语言模型端侧CPU推理优化

在大语言模型(LLM)端侧部署上&#xff0c;基于 MNN 实现的 mnn-llm 项目已经展现出业界领先的性能&#xff0c;特别是在 ARM 架构的 CPU 上。目前利用 mnn-llm 的推理能力&#xff0c;qwen-1.8b在mnn-llm的驱动下能够在移动端达到端侧实时会话的能力&#xff0c;能够在较低内存…

MySQL之视图外连接、内连接和子查询的使用

一、视图 1.1 含义 虚拟表&#xff0c;和普通表一样使用 1.2 操作 创建视图 create view 视图名 as 修改视图 方式一&#xff1a; create or replace view 视图名 as 【查看视图相关字段】 方式二&#xff1a; alter view 视图名 as 【查看的SQL语句】 查看视图 方式一&…

Nginx快速入门:Nginx实现高可用|结合keepalived实现主备节点(九)

0. 引言 在生产中我们要尽可能避免单点故障&#xff0c;nginx也不例外&#xff0c;因此搭建主备节点必不可少&#xff0c;今天我们来学习下如何利用keepalived实现主备 1. keepalived简介 keepalived 是一个LINUX系统中开源的负载均衡和故障转移软件&#xff0c;它主要用于高…

2024年阿里云、腾讯云、华为云、LightNode、硅云服务器如何选?怎么买最划算?[最新价格表]

很多小伙伴都有一颗上云的心&#xff0c;包括我自己 有事没事的折腾一下自己的小破站&#xff0c;也挺有意思的&#xff01; 那么&#xff0c;云服务器哪家好&#xff1f;优惠力度哪家大&#xff1f;活动入口哪里进&#xff1f;云服务器如何配置&#xff1f;如何选型&#xf…

K8S集群部署解决工作节点couldn‘t get current server API group list问题

最近在自己电脑上装了VMWare Player&#xff0c;在上面装了两个Ubuntu虚拟机&#xff0c;为了方便学习云原生技术&#xff0c;决定在上面装一个2个节点&#xff08;一个控制面&#xff0c;一个工作节点&#xff09;的K8S集群。 参考这篇文章&#xff1a; Ubuntu 22.04 搭建K8…

kubectl的插件安装工具krew

最近得知一个kubectl插件安装工具&#xff0c;叫做krew。 官网地址是&#xff1a;Krew – kubectl plugin manager 安装krew 按照官网的做法&#xff0c;一直安装失败&#xff0c;于是拆解步骤&#xff0c;一步一步下载离线安装。 1、下载krew.yaml 地址&#xff1a;https:…

Proteus 各版本安装指南

Proteus下载链接 https://pan.baidu.com/s/1vHgg8jK9KSHdxSU9SDy4vQ?pwd0531 1.鼠标右击【Proteus8.15(64bit&#xff09;】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到Proteus8.15(64bit&#xff09; 】。 2.打开解压后的文件夹&#…

适用于生物行业的生信云平台

随着基因检测技术的不断发展&#xff0c;生物信息云平台在基因检测行业的应用越来越广泛。生物信息云平台是一种基于云计算的技术&#xff0c;可以将基因检测数据存储在云端&#xff0c;并通过数据分析、挖掘等技术手段&#xff0c;对基因数据进行处理、分析和解读。 这种技术的…

Linux安装nginx(带http ssl)

nginx安装 nginx文件 以及gcc pcre zlib openssl 网盘下载 1.安装gcc yum -y install gcc gcc-c 2.安装pcre rpm -ivh pcre-8.32-17.el7.x86_64.rpm --force --nodeps rpm -ivh pcre-devel-8.32-17.el7.x86_64.rpm --force --nodeps 3.安装zlib tar -zxvf zlib-1.2.11.ta…

metaSPAdes,megahit,IDBA-UB:宏基因组装软件安装与使用

metaSPAdes,megahit,IDBA-UB是目前比较主流的宏基因组组装软件 metaSPAdes安装 GitHub - ablab/spades: SPAdes Genome Assembler #3.15.5的预编译版貌似有问题&#xff0c;使用源码安装试试 wget http://cab.spbu.ru/files/release3.15.5/SPAdes-3.15.5.tar.gz tar -xzf SP…

C++ 给父类带参构造函数的赋值

在类的使用中&#xff0c;默认的构造函数不带任何参数&#xff0c;但是也会因为需要而使用带参数的构造函数。 在带参的构造函数中&#xff0c;是如何继承的呢&#xff0c;这里我们通过使用基类&#xff0c;子类&#xff0c;孙类的两重继承来观察&#xff0c;如何给带参构造函数…