堆排序以及其插入删除

堆排序

首先介绍一下堆排序属于选择排序的一种类型。

其次就是他有点依赖于顺序存储树判断其孩子以及父节点的概念,接下来复习一下。

堆分为大根堆和小根堆

① 若满⾜:L(i)≥L(2i)且L(i)≥L(2i+1) (1 ≤ i ≤n/2 )—— ⼤根堆(⼤顶堆)
② 若满⾜:L(i)≤L(2i)且L(i)≤L(2i+1) (1 ≤ i ≤n/2 )—— ⼩根堆(⼩顶堆)

注意这里的判断条件结合一下前面树的节点判断条件来看。

接下来介绍如何进行堆排序,

在大根堆中堆顶元素的关键字值最大,

接下里介绍一下给出一堆数组如何建立大根堆,这里一定注意结合树来理解。

思路:把所有⾮终端结点都检查⼀遍,是否满⾜⼤根堆的要求,如果不满⾜,则进⾏调整

在顺序存储的完全⼆叉树中,⾮终端结点编号 i≤⌊n/2⌋

简单来说就是检查数组的前一半元素(采取从后到前的顺序)因为⾮终端结点编号 i≤⌊n/2⌋。检查这一半的非终端节点是否满足大根堆的定义看左右孩子是否都比他小

结合这个例子来看,你会发现一般的元素就是从下标4 开始算起,接下来就开始检查9会发现左子树大于根所以需要交换位置(包含数组中的位置,可以考虑采用swap来进行元素的交换。),如图所示

接下来该检查78了,会发现87比它大。所以需要交换元素。处理完同时扫描下一个元素也就是17。

扫描17发现左右孩子都比它大就需要选取最大的一个了这样才能满足大根堆的定义。

处理如下。

接着再处理53

53的处理有点特殊

53交换元素后还是不满足定义,这时就需要再一次的下坠。

此时得到一个大根堆的树形

接下来我们看一下代码的实现以及解析

从上往下看,首先设置i为二分之length同时因为为了方便操作第一个元素也就是数组0元素不存储数据。然后调用函数

接下来解析函数

首先设置数组0用来临时存储根节点,然后借用一个循环注意这里的传参上一个函数传过来的i值(也就是用来算非终端节点的i)在本函数中用K来表示了,具体的比较函数的定义

理解了K然后我们继续看循环,循环体重新设置了一个变量i等于2k用来找到孩子节点,同时注意i要小于数组长度否则没有意义可能程序还会被脏数据污染。循环条件是可以看为i=i*2

接下来进入循环体,这一步是用来选取子节点里面较大的那个节点,如果大,那么就让i+1也就是孩子中大的那个的下标。如果没有就说明时i大那就保持原本的。

如果也就是暂存的元素(此时涉及到的非终端节点)大那就不需要交换位置此时这一棵子树满足大根堆的定义就可以直接跳出 循环执行也就是原来的位置处

如果不满足也就是孩子大那就将孩子调整到K的位置然后修改K值再一次执行此时注意循环条件,再一次检查调整过后是否还需要下坠才满足大根堆的条件直到即跳出来数组,此时这个判断条件说明这个节点已经不能下坠了此时的节点一定是终端节点也就是叶子节点依据

来判断的,如果是这样的话也直接执行,即将叶子节点的值设为暂存的元素值,因为它实在太小了,只能不断地下坠到达叶子节点。具体的看一下接下来53的过程.

 

同时改该函数里面的i值判断接下来的值是否符合标准。

再一次执行此时溢出数组了,结束循环。 

上面的代码是建立大根堆,接下里我们介绍基于大根堆实现完整的排序 

 接下来看一下堆排序的完整代码。 

接下来的才是完整堆排序的思想

堆排序:每⼀趟将堆顶元素加⼊有序⼦序列(与待排序序列中的最后⼀个元素交换)

并将待排序元素序列再次调整为⼤根堆(⼩元素不断“下坠”)

第一步交换9 和87

然后新的大根堆需要length-1以方便重新排堆(让87直接输出到数组末尾同时重新拍大根堆不算87)

调整如下

再一次首元素和末尾元素

然后再一次调整剩下的元素的大根堆同时新大根堆的调整长度需要减1.

再次断开一个元素,再次调整大根堆剩下操作如此往复即可

n-1趟 处理之后:

接下来我们整合调整过程

注意一下完整逻辑的代码

这里第一步是建立了一个堆应该是如下图所示的

此时定义i让他指向最后一个元素用于交换首尾元素同时要实现上面断掉元素的过程让i--,进入循环交换首位元素然后调整大根堆,此时注意一下传入参数的信息。

调整数组A以下标为1的根堆长度为i-1。再然后循环起来i--再一次交换元素,然后再一次调整,实现之前说过的调整趟数的过程,最后得出升序排序。

堆的插入删除

首先声明一下,减轻一下心里负担的压力,堆的删除插入只要求弄懂手算过程没有代码,但是要求学会计算对比次数。

这里以小根堆为例演示一下

插入

插入13

注意小根堆规则,根要小于孩子。注意元素的上升,

1.首先对比,32和13发现13小然后就上升13

2.然后对比13和17,发现13需要上升

3.再次对比13和9,发现现在不需要上升了。

此时共发生了三次关键字的对比。

接下来插入一下46

发现只需要1次对比它不会上升。

接下来看一下删除的操作

删除

被删除的元素⽤堆底元素替代,然后让该
元素不断“下坠”,直到⽆法下坠为⽌

元素被删除了就会采用堆底的元素来代替。这里删除13可以选取46来做代替,选取代替元素的规则(要求拆掉元素以后满足二叉树的定义所以只能拆掉46),

拆掉46以后还得让其满足小根堆的要求先需要对比孩子里面小的值,然后拿孩子里面小的值来和根对比

第一次17和45比较;第二次17和46比较下沉46;第三次52和32比较;第四次比较46和32下沉46

总共对比了4次注意若下方就一个孩子则下坠只涉及到一次对比就没有孩子间的那次对比了。

接下来删除65试试

为了符合二叉树的规则只能借用46

第一次对比78和87,第二次对比78和46,对比结束

接下来总结一下

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

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

相关文章

Spring Boot项目结构解析:构建高效、清晰的代码框架

在当今的软件开发领域,Spring Boot因其简洁性和强大的功能而备受青睐。它不仅简化了Spring框架的配置,还提供了一套高效的项目开发模式。本文将深入探讨Spring Boot项目结构中的关键组件,包括PO、Query、VO、Config等,旨在帮助开发…

多客户端 - 服务器结构-实操

实现2个客户端之间互相聊天 要求: 1、服务器使用 select 模型实现接受多个客户端连接,以及转发消息 2、客户端要求:使用 poll 模型解决 技能够 read 读取服务器发来的消息,又能够scanf读取键盘输入的信息 3、客户端服务器不允许开…

iOS高级开发工程师面试——Objective-C 语言特性

iOS高级开发工程师面试——Objective-C 语言特性 一、多态二、继承三、代理(Delegate)1. 代理为什么用 weak 修饰呢?block和代理的区别?四、通知(NSNotificationCenter)五、KVC (Key-value Coding)六、属性七、`@property` [ˈprɒpəti]的本质是什么?ivar 、 setter …

MMpretrain 中的 LinearClsHead 结构与优化

LinearClsHead 结构与优化 一、LinearClsHead 核心结构 在 MMPretrain 中,LinearClsHead 是一个简洁高效的分类头,其核心结构如下: class LinearClsHead(BaseModule):def __init__(self,num_classes, # 类别数量in_channels, # 输入…

Spring 学习笔记

1.Spring AOP 怎么实现的AOP 即面向切面编程,是通过代理实现的,主要分为静态代理和动态代理,静态代理就是在程序运行前就已经指定并声明了代理类和增强逻辑,运行时就已经被编译为字节码文件了,而动态代理则是在运行过程…

【CVPR2024】计算机视觉|InceptionNeXt:速度与精度齐飞的CNN架构

论文地址:http://arxiv.org/pdf/2303.16900v3 代码地址:https://github.com/sail-sg/inceptionnext 关注UP CV缝合怪,分享最计算机视觉新即插即用模块,并提供配套的论文资料与代码。 https://space.bilibili.com/473764881 摘要…

7.15 窗口函数 | 二分 | 位运算 | 字符串dp

lc3316. 字符串dpdp多开一行一列后,注意原字符串下标映射dp[n][m] ( n 是source长度, m 是pattern长度)两重循环填表for i 1-nfor j 0-m三种状态转移1.不选 dp i jdp i-1 j2.不选if tag, dp[i][j]3.if(s ip j) 选,dp i…

Spring原理揭秘--初识AOP

我们知道软件开发一直在追求高效,易维护,易扩展的特性方式。在面向过程编程到面向对象编程的历程中,程序的开发有了非常大的进步。但是oop的方式缺依然存在着一些缺点。oop的方式可以将业务进行很好的分解和封装使其模块化,但是却…

Provider模式:软件架构中的“供应商“设计哲学

文章目录Provider模式:软件架构中的“供应商“设计哲学什么是Provider模式?经典应用场景1. 配置管理Provider2. 数据访问Provider4. 消息队列ProviderProvider模式的优势1. 解耦合实际项目中的应用Provider模式的最佳实践1. 命名约定2. 接口设计原则3. 错…

LTspic下载,帮助及演示电路

1.下载 LTspice是一款强大高效的免费SPICE仿真器软件、原理图采集和波形观测器,为改善模拟电路的仿真提供增强功能和模型。其原理图捕获图形界面使您能够探测原理图并生成仿真结果,这些结果可以通过内置波形查看器进一步观察分析。 链接: …

位置编码/绝对位置编码/相对位置编码/Rope原理+公式详细推导及代码实现

文章目录1. 位置编码概述1.1 为什么需要位置编码?2. 绝对位置编码 (Absolute Position Encoding)2.1 原理2.2 数学公式2.3 代码实现2.4 代码与公式的对应关系2.5 特性与优势2.6 可学习的绝对位置编码3. 相对位置编码 (Relative Position Encoding)3.1 原理3.2 数学公…

网络安全初级第一次作业

一,docker搭建和挂载vpm 1.安装 Docker apt-get install docker.io docker-compose 2.创建文件 mkdir /etc/docker.service.d vim /etc/docker.service.d/http-proxy.conf 3.改写文件配置 [Service] Environment"HTTP_PROXYhttp://192.168.10.103:7890…

交换类排序的C语言实现

交换类排序包括冒泡排序和快速排序两种。冒泡排序基本介绍冒泡排序是通过重复比较相邻元素并交换位置实现排序。其核心思想是每一轮遍历将未排序序列中的最大(或最小)元素"浮动"到正确位置,类似气泡上升。基本过程是从序列起始位置…

嵌入式 Linux开发环境构建之Source Insight 的安装和使用

目录 一、Source Insight 的安装 二、Source Insight 使用 一、Source Insight 的安装 这个软件是代码编辑和查看软件,打开开发板光盘软件,然后右键选择以管理员身份运行这个安装包。在弹出来的安装向导里面点击 next ,如下图所示。这里选择…

【字节跳动】数据挖掘面试题0016:解释AUC的定义,它解决了什么问题,优缺点是什么,并说出工业界如何计算AUC。

文章大纲 AUC(Area Under the Curve)详解一、定义:AUC是什么?二、解决了什么问题?三、优缺点分析四、工业界大规模计算AUC的方法1. 标准计算(小数据)2. 工业级大规模计算方案3.工业界最佳实践4.工业界方案选型建议总结:AUC的本质AUC(Area Under the Curve)详解 一、…

Python后端项目之:我为什么使用pdm+uv

在试用了一段时间的uv和pdm之后,上个月(2025.06)开始,逐步把用了几年的poetry替换成了pdmuv(pipx install pdm uv && pdm config use_uv true) ## 为什么poetry -> pdm: 1. 通过ssh连接到服务器并使用poetry shell激活虚拟环境之…

鸿蒙Next开发,配置Navigation的Route

1. 通过router_map.json配置文件进行 创建页面配置router_map.json {"routerMap": [{"name": "StateExamplePage","pageSourceFile": "src/main/ets/pages/state/StateExamplePage.ets","buildFunction": "P…

在 GitHub 上创建私有仓库

一、在 GitHub 上创建私有仓库打开 GitHub官网 并登录。点击右上角的 “” → 选择 “New repository”。填写以下内容: Repository name:仓库名称,例如 my-private-repo。Description:可选,仓库描述。Visibility&…

量产技巧之RK3588 Android12默认移除导航栏状态栏​

本文介绍使用源码编译默认去掉导航栏/状态栏方法,以触觉智能EVB3588开发板演示,Android12系统,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效…

Conda 安装与配置详解及常见问题解决

《Conda 安装与配置详解及常见问题解决》 安装 Conda 有两种主流方式,分别是安装 Miniconda(轻量级)和 Anaconda(包含常用数据科学包)。下面为你详细介绍安装步骤和注意要点。 一、安装 Miniconda(推荐&a…