常见的排序算法过程和比较分析
比较分析
排序类别 | 排序算法 | 时间复杂度(最好) | 时间复杂度(最坏) | 时间复杂度(平均) | 辅助空间复杂度 | 稳定性 |
---|---|---|---|---|---|---|
插入排序 | 直接插入排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
插入排序 | 折半插入排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
插入排序 | 希尔排序 | O(n) | O(n²) | O(n^1.3) | O(1) | 不稳定 |
交换排序 | 冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
交换排序 | 快速排序 | O(nlog₂n) | O(n²) | O(nlog₂n) | O(log₂n) | 不稳定 |
选择排序 | 简单选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 |
选择排序 | 堆排序 | O(nlog₂n) | O(nlog₂n) | O(nlog₂n) | O(1) | 不稳定 |
归并排序 | 二路归并排序 | O(nlog₂n) | O(nlog₂n) | O(nlog₂n) | O(n) | 稳定 |
基数排序 | 基数排序 | O(d(n + k)) | O(d(n + k)) | O(d(n + k)) | O(n + k) | 稳定 |
快速排序
步骤:
- 任取一元素作为枢轴(pivot),图中取的枢轴值为 56。
- 将序列划分成两部分,左部分元素值
<=
枢轴,右部分元素值>=
枢轴。 - 然后递归处理左右部分,直到子序列为空或只剩一个元素。
图示:
pivot = 56
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
值 | 空(56) | 23 | 45 | 76 | 69 | 20 | 45 | 93 | 16 | 82 | 27 |
👆left | 👆right |
index = 0 存放枢轴 56 ,
(1) 若 right 对应的值小于 56 则填到 left 处,然后 left++(此时 right 处有空需要左边的填到右边)
(2) 若 right 对应的值大于 56 则不需改变只需要 right--
(3) 若 (1) 成立则看 left++后指向的位置是否大于 56,若大于 56 则填到 right 处,后 right--;
若 left++后的值小于 56 则不改变位置 left++(空位仍在右边)
(4) 重复上述过程直到划分完毕
- 选择枢轴(pivot = 56):
- 左部分(left):<= pivot
- 右部分(right):>= pivot
- 操作步骤:
- right 从右往左找比枢轴小的元素去填 left 的坑。
- left 从左往右找比枢轴大的元素去填 right 的坑。
冒泡排序
步骤:
- 从序列的第一个元素开始,依次比较相邻的两个元素。
- 如果前一个元素大于后一个元素,则交换它们的位置。
- 对整个序列重复上述比较和交换操作,每次遍历都会将当前未排序部分的最大元素 “冒泡” 到末尾。
- 持续进行上述操作,直到整个序列有序。
图示:
假设初始序列为:
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
值 | 27 | 23 | 45 | 76 | 69 | 20 | 45 | 93 | 16 | 82 | 56 |
(1) 第一轮比较:
- 比较第 0 个元素和第 1 个元素(27 和 23),因为 27 > 23,交换位置。
- 序列变为:23,27,45,76,69,20,45,93,16,82,56
- 比较第 1 个元素和第 2 个元素(27 和 45),不交换。
- 依次类推,比较第 2 个元素和第 3 个元素(45 和 76),不交换……
- 比较第 9 个元素和第 10 个元素(82 和 56),因为 82 > 56,交换位置。
- 第一轮结束后,最大的元素 93 “冒泡” 到了末尾。
(2) 第二轮比较: - 重复上述比较和交换操作,但这次只需要比较到倒数第二个元素,因为最大元素已经在末尾了。
- 第二轮结束后,第二大的元素 82 “冒泡” 到了倒数第二个位置。
(3) 持续进行上述操作: - 每一轮都会将当前未排序部分的最大元素移动到正确位置。
- 直到整个序列有序。
- 操作步骤总结:
- 每一轮从序列的开头开始,依次比较相邻元素,如果顺序不对就交换。
- 每一轮过后,未排序部分的最大元素就会移动到末尾,下一轮比较的范围就减少一个元素。
- 重复这个过程,直到整个序列有序。
优化方式
- 设置一个 bool 类型的swapped 变量每一轮初始化为 false,只要在本轮内存在交换操作,那么久 swapped = true
- 如果某一轮执行完毕后 swapped 仍然为 fasle 说明在此轮中没有交换产生,数列已经有序
(这样防止了在排序过程中,某轮结束后,已经有序但是仍然遍历的情况)
堆排序
堆
- 是个完全二叉树 (除最下面一层都是满的,最下面一层从左到右依次排序,没有空的)
- 大根堆 任意节点>=其左右孩子
- 小根堆 任意节点<=其左右孩子
一般用顺序存储存放堆
如下所示 上边是逻辑结婚下边是存储结构
下标从 1 开始 index有这个规律
父亲 = ⌊ i / 2 ⌋ \lfloor i/2\rfloor ⌊i/2⌋ 左孩子 = 2 i 2i 2i 右孩子 = 2 i + 1 2i+1 2i+1
步骤
- 建堆
- 从最后一个非叶结点开始依次向下调整
- 排序
- 每轮堆顶换到最后,向下调整新的堆顶 (n - 1) 轮
手算
快速排序
- 手算快速排序时 L R 指针左右移动
- R 指到< pivot 的放到 L 处(L 原先为空, 放入后 R 为空 L 非空)
然后视角切换到 L
若 R 未指到< pivot 的则 R 继续移动 - L 指到> pivot 的放到 R 处(R 原先为空,放入后 L 为空 R 非空 )
然后视角切换到 R
若 L 未指到> pivot 的则 L 继续移动 - L == R 时,pivot 归位
- 递归的处理 pivot 左右两边的部分,方法同上
堆排序
看到一组乱序关键字时
- 先按照关键字目前的顺序,依次填入一棵完全二叉树 (横着一行一行的填入)
- 然后依次调整树为大根堆/小根堆
- 调整完成之后树的根节点和最后一个关键字 (序号最大的) 调换位置
此时的便是第一轮排序后的结果 (最后一个也就是刚由根节点调换过来的关键字已归位) - 然后再不包括最后一个关键字的基础上对于前 n-1 个数重新做上述工作
- 直到每个关键字都归位
相关文章:

常见的排序算法过程和比较分析
比较分析 排序类别排序算法时间复杂度(最好)时间复杂度(最坏)时间复杂度(平均)辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…...

基于Vue+SSM+SpringCloudAlibaba书籍管理系统
功能要求 一、登录功能(http://localhost:8080/#/login) 输入账号和密码(admin/admin)进行登录: 如果密码错误,给出提示信息 如果密码正确,跳转到主页 账号或密码错误: 账号密码正确:跳转到…...
生成式 AI 增强了个人创造力,但减少了新内容的集体多样性
创造力是人类的核心。生成式人工智能 (AI)(包括强大的大型语言模型 (LLM))有望让人类通过提供新想法来更具创造力,或者通过锚定生成式 AI 想法来降低创造力。我们在一项在线实验中研究了生成式 AI 想法对短篇小说制作的因果影响,其中一些作家从 LLM 那里获得了故事创意…...

【DC简介--Part1】
DC简介-Part1 1 overview1.1 DC操作步骤1.2 Steps1.2.1 Develop HDL files1.2.2 Specify libraries1.2.3 Read design1.2.4 Define design environment1.2.5 Set design constraints1.2.6 Select compile strategy1.2.7 Synthesize and optimize the design1.2.8 Analyze and r…...
Spark写入HDFS数据SUCCESS文件生成控制
Spark写入HDFS数据SUCCESS文件 1、_SUCCESS的控制2、_SUCCESS的实现 1、_SUCCESS的控制 与Hive不同,MapReduce和Spark在执行写入HDFS数据任务时,数据输出目录一般都会有一个名为_SUCCESS的空文件,该文件仅用来表示任务执行成功 但有些时候&a…...

MySQL 服务器简介
通常所说的 MySQL 服务器指的是mysqld程序,当运⾏mysqld后对外提供MySQL 服务,这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容,包括: 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选项。 服务器系统变…...
如何使用Python从SACS结构数据文件中提取节点数据信息并导出到EXCEL
在现代工程设计中,结构分析和数据处理是不可或缺的一部分。特别是在海洋工程、桥梁建设等领域,SACS文件被广泛应用。这种文件格式包含了结构模型的各种重要信息,包括节点(JOINT)、构件(ELEMENT)…...
Java网约车项目实战:实现抢单功能详解
在网约车项目中,抢单功能是非常关键的一部分,它决定了司机能否及时响应乘客的订单,提高整个平台的运营效率。本文将详细介绍如何使用Java来实现网约车项目的抢单功能,并提供一个完整的代码示例,以便读者能够直接运行和…...

SSRF服务端请求Gopher伪协议白盒测试
前言 是什么SSRF? 这个简单点说就是 服务端的请求伪造 就是这个如果是个 请求图片的网站 他的目的是请求外部其他网站的 图片 但是 SSRF指的是让他请求本地的图片 再展示出来 请求的是他的服务器上的图片 SSRF(Server-Side Request Forgery:服务器端请求伪造) …...

html+css+js网页设计 美食 家美食1个页面
htmlcssjs网页设计 美食 家美食1个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1…...

初学stm32---高级定时器输出n个pwm波
目录 高级定时器简介:(F1) 高级定时器框图 重复计数器特性 高级定时器输出指定个数PWM实验原理 高级定时器输出指定个数PWM实验配置步骤 相关HAL库函数介绍 关键结构体介绍 高级定时器简介:(F1) 1.高级定时器 :TIM1/TIM8 2.主要特性&…...

旅游管理系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

imgproxy图像处理的高效与安全
摘要 imgproxy作为一个高效且安全的独立服务器,为图像处理提供了全新的解决方案。它不仅简化了图像调整和转换的过程,还极大地提升了处理速度,确保了整个流程的安全性。通过集成imgproxy,用户可以轻松优化网页上的图像,提高加载速度,改善用户体验。本文将深入探讨imgpro…...
LLM并行计算的论文
LLM并行计算的论文 基础并行计算方法相关 《Gpipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism》:提出了Gpipe这种流水线并行方法,通过将数据批量进一步等分成若干microbatch,并以流水线的方式执行,减少计算中空泡的比例,极大地拓展了模型…...

Linux 搭建 nginx+keepalived 高可用 | Nginx反向代理
注意:本文为 “Linux 搭建 nginxkeepalived (主备双主模式) 高可用 | Nginx反向代理” 相关文章合辑。 KeepalivedNginx实现高可用(HA) xyang0917 于 2016-09-17 00:24:15 发布 keepalived 的 HA 分为抢占模式和非抢占模式,抢占…...
Spring Boot 项目中 Maven 剔除无用 Jar 引用的最佳实践
目录 引言Maven 依赖管理的基础概念 2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机制 无用依赖的常见问题与影响剔除无用 Jar 引用的常见方法 4.1 识别无用依赖4.2 使用 Maven 的 dependency:analyze 插件4.3 配置 scope 以优化依赖范围4.4 使用 exclude 排除传递依赖4.5 分析…...

useWhyDidYouUpdate详解
目录 API Params demo演示 源码 useWhyDidYouUpdate是ahooks库中的一个hook函数,用于帮助开发者排查是哪个属性改变导致了组件的 rerender。 API type IProps Record<string, any>;useWhyDidYouUpdate(componentName: string, props: IProps): void; …...
c++入门——c++输入cin和输出cout的简单使用
c输入cin、输出cout 1 cin2 cout3 cin和cout说明 c在c语言的输入、输出函数的基础上进行了封装。 1 cin c可以理解为控制台,in可以理解为输入。 参考代码: void f(){int a;float b;double c;char d;cin>>a>>b>>c>>d;//这里和…...

Spring Cloud LoadBalancer (负载均衡)
目录 什么是负载均衡 服务端负载均衡 客户端负载均衡 Spring Cloud LoadBalancer快速上手 启动多个product-service实例 测试负载均衡 负载均衡策略 自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance,简称 LB) , 是高并发, 高可用系统必不可少的关…...

微服务-1 认识微服务
目录 1 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 2 服务拆分原则 2.1 什么时候拆 2.2 怎么拆 2.3 服务调用 3. 服务注册与发现 3.1 注册中心原理 3.2 Nacos注册中心 3.3 服务注册 3.3.1 添加依赖 3.3.2 配置Nacos 3.3.3 启动服务实例 …...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...