常见的排序算法过程和比较分析
比较分析
| 排序类别 | 排序算法 | 时间复杂度(最好) | 时间复杂度(最坏) | 时间复杂度(平均) | 辅助空间复杂度 | 稳定性 |
|---|---|---|---|---|---|---|
| 插入排序 | 直接插入排序 | 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 的坑。
![![[Pasted image 20241226134232.png]]](https://i-blog.csdnimg.cn/direct/a5ea28b2d0c141b28a0869c23cb9973b.png)
冒泡排序
步骤:
- 从序列的第一个元素开始,依次比较相邻的两个元素。
- 如果前一个元素大于后一个元素,则交换它们的位置。
- 对整个序列重复上述比较和交换操作,每次遍历都会将当前未排序部分的最大元素 “冒泡” 到末尾。
- 持续进行上述操作,直到整个序列有序。
图示:
假设初始序列为:
| 索引 | 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 说明在此轮中没有交换产生,数列已经有序
(这样防止了在排序过程中,某轮结束后,已经有序但是仍然遍历的情况)
![![[Pasted image 20241226135646.png]]](https://i-blog.csdnimg.cn/direct/b6d773346b094902a9183615e5735c6b.png)
堆排序
堆
- 是个完全二叉树 (除最下面一层都是满的,最下面一层从左到右依次排序,没有空的)
- 大根堆 任意节点>=其左右孩子
- 小根堆 任意节点<=其左右孩子
一般用顺序存储存放堆
如下所示 上边是逻辑结婚下边是存储结构
![![[Pasted image 20241226145531.png]]](https://i-blog.csdnimg.cn/direct/4163730a7306425d9f983702f128c058.png)
下标从 1 开始 index有这个规律
父亲 = ⌊ i / 2 ⌋ \lfloor i/2\rfloor ⌊i/2⌋ 左孩子 = 2 i 2i 2i 右孩子 = 2 i + 1 2i+1 2i+1
步骤
- 建堆
- 从最后一个非叶结点开始依次向下调整
- 排序
- 每轮堆顶换到最后,向下调整新的堆顶 (n - 1) 轮
![![[Pasted image 20241226151956.png]]](https://i-blog.csdnimg.cn/direct/a07f523d1f4e4241986c0498ba9133c0.png)
手算
快速排序
- 手算快速排序时 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 启动服务实例 …...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
