最大堆/最小堆、siftup和siftdown

十大排序算法: 堆排序 文章目录堆的定义堆的存储结构堆调整步骤构造堆堆调整代码面试题思路代码 堆的定义 堆是一颗完全二叉树; 堆中某个节点的值总是不大于(或不小于)其父节点的值 其中,我们把根节点最大的堆叫做大顶堆,根节点最小的堆叫做小顶堆。 堆的存储结构 数组 堆调整 堆调整又名heapify,以大顶堆为例,大顶堆的堆调整即将左右子树中较大者的值与父节点的值对换,递归进行该过程,使得当前树满足arr[i] ... 阅读详情
从数据的存储结构看,最大堆/最小堆是一个数组。
从数据的逻辑结构看,最大堆/最小堆是一棵完全二叉树。

堆有以下三种基本操作:
1.初始化:将一个无序的序列初始化成堆。从最后一个非叶子结点(namely, (max_index-1)/2)开始,自右向左,自下向上,对每一个根结点执行siftdown操作。O(N)。
2.插入。在数组的末尾插入新的元素,然后执行siftup操作。O(logN)。
3.删除。删除指定位置的元素,用数组末尾的元素代替。然后视情况执行siftup或者siftdown操作(注意这两个操作是互斥的,只能执行其中之一)。O(logN)。

当前元素若可能与下一层元素交换,就是siftdown;若可能与上一层元素交换,就是siftup。或者说当前元素被“挖出”后形成的“坑”,若往上升就是siftup,若往下降就是siftdown。

以下是siftup和siftdown的代码(以最小堆为例):
void siftup(int position)
{
    int child=position;
    int father=(child-1)/2;

    int temp=minheap[position];    //把要处理的元素“挖出来”,形成一个“坑”

    while(father>=0 && child>=1)
    {
        if(minheap[father]>temp)
        {
            minheap[child]=minheap[father];    //“坑”往上升

            child=father;    //更新下标
            father=(child-1)/2;
        }
        else
            break;
    }

    minheap[child]=temp;    //把temp填回“坑”里去
}

void siftdown(int position, int heapsize)
{
    int father=position;
    int child=father*2+1;

    int temp=minheap[position];    //仍然是挖坑

    while(child<heapsize)
    {
        if(child<heapsize-1 && minheap[child]>minheap[child+1])    //两个儿子较小的哪一个
            child=child+1;

        if(temp>minheap[child])
        {
            minheap[father]=minheap[child];    //坑往下沉

            father=child;    //更新下标
            child=2*father+1;
        }
        else
            break;    
    }

    minheap[father]=temp;    //填坑
}

130. Heapify-堆化(siftup & siftdown版本) Description给出一个整数数组,堆化操作就是把它变成一个最小堆数组。对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。说明什么是堆?堆是一种数据结构,它通常有三种方法:push, pop 和 top。其中,“push”添加新的元素进入堆,“pop”删除堆中最小/最大元素,“top”返回堆中最小/最... 阅读详情

相关推荐

TJA1445/TJA1465 CAN收发器硬件设计与软件配置实战指南

控制器局域网(CAN)总线是汽车电子和工业控制领域实现电子控制单元(ECU)间可靠通信的核心技术。其工作原理是将数字信号转换为差分信号进行抗干扰传输,技术价值在于构建稳定、高效的分布式实时控制系统。随着汽车电子架构向域集中式演进,对CAN总线的通信速率、网络复杂度和静态功耗提出了更高要求,这催生了支持CAN FD协议和智能电源管理的新一代高速CAN收发器。在车载网关、域控制器及工业网络节点等应用场景中,NXP的TJA1445和TJA1465系列收发器凭借其部分组网(Partial Networking)和选

weixin_29655587的博客 410

图解数据结构与算法

【为什么学习数据结构与算法】    程序=数据结构+算法。数据结构和算法是程序的基础,没有系统地学习过数据结构和算法的程序员只能称作是coder,知道我们写的代码使用了什么数据结构,它的特征是什么。知道解决某些问题是用的何种算法才会从coder晋升为工程师。另外,大厂面试数据结构和算法也是我们绕不过去的一个门槛。这部分恰好又不是突击能够解决的知识储备,所以很有必要系统地学习一下数据结构和算法了【推荐您学习这门课程的原因】1、图解数据结构与算法:拒绝抽象枯燥的学习,本课程采用动画演示的形式,让您在动画中掌握算法的底层原理。下面是课程中几个动画的演示效果:   2、实战2020大厂算法面试题:解析大厂算法面试题,分析其中算法原理,并动手实操,让大家通关面试最后一道题。  3、全面、系统化的课程设计:系统化讲解数据结构与算法,让你快速梳理整个算法知识体系,掌握算法的核心思想。 【主讲讲师】 孙玖祥:8年互联网开发经验,3年教学经验; 擅长JAVA技术栈、高并发高可用伸缩式微服务架构; 曾多次参与大型银行和互联网公司核心系统的架构设计和开发; 丰富的教学和就业经验,所带毕业学员逾千人,所带班级月内就业率均达98%以上。

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 496

堆 之 Sift-up和Sift-down

  1.sift-up 假定对于某个i&gt;1,H[i]变成了键值大于它父节点键值的元素,这样就违反了堆的特性。我们需要使用Sift-up运算把新的数据项移到在二叉树中适合它的位置上。 Sift-up的运算沿着从H[i]到根节点的唯一一条路径,把H[i]移到适合它的位置上。在沿着路径的每一步上,都将H[i]键值和它父节点的键值H[⌊i/2⌋]相比较。 常用于:插入操作 代码: ...

Kaka_chake的博客 2704

C#实现不占用串口的串口监听与侦听技术:高效监控串口数据的最佳实践

本文详细介绍了如何实现不占用串口的串口监听与侦听技术,解决了传统串口监听可能带来的串口占用问题。通过使用虚拟串口、外部监听工具或第三方库,我们可以高效地实现串口数据的捕获与处理,适用于各种工业控制、物联网和嵌入式开发的应用场景。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1676

HIC测序数据生信分析——第三节,HIC数据挂载

(取决于是否运行①prune模块,若①运行,则③运行;#HIC预处理后的比对文件Unknown_BM942-001H0001_1_val_1.Unknown_BM942-001H0001_2_val_2.hicup.bam 和contig基因组序列文件genome.fa。#HIC预处理后的比对文件Unknown_BM942-001H0001_1_val_1.Unknown_BM942-001H0001_2_val_2.hicup.bam 和contig基因组序列文件genome.fa。#这个方法简单一点。

weixin_44616693的博客 3598

算法 之 堆 - Sift-up和Sift-down

1. Sift-up 假定对于某个i&gt;1,H[i]变成了键值大于它父节点键值的元素,这样就违反了堆的特性。我们需要使用Sift-up运算把新的数据项移到在二叉树中适合它的位置上。 Sift-up的运算沿着从H[i]到根节点的唯一一条路径,把H[i]移到适合它的位置上。在沿着路径的每一步上,都将H[i]键值和它父节点的键值H[⌊i/2⌋]相比较。   过程  Sift-up 输入  ...

我不是标题党 1917

【GameFramework框架内置模块】6、实体(Entity)

实体Entity就是一个实体的基本单元,类似于Unity的GameObject对象本体,然后这个本体上面附加其他各种各样组件,才能实现各种各样的功能。一般需要在游戏运行时动态加载的游戏对象,比如怪物、武器、子弹、特效,都需要给这个物体挂载一个实体Entity,这样的话就可以方便的对实例出来的对象进行管理。下面就来看一下如何使用吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3137

数据结构学习 -- 堆和优先队列

堆和优先队列 二叉堆 堆通常使用了树的存储方式,比较常用的堆是:二叉堆,也就是满足一些特殊性质的二叉树。 二叉堆的性质 1️⃣ 二叉堆必须是一颗完全二叉树,所谓完全二叉树可以理解为将元素按顺序一层一层的排列成二叉树的形状,完全二叉树的特点为: 完全二叉树是一颗叶子节点只能出现在最下面两层的二叉树。 完全二叉树最下面一层的叶子节点必须从左至右连续出现,中间不能出现空节点。 完全二叉树倒数第二层的如果有叶子节点,一定位于右边连续位置。 完全二叉树中如果节点只有一个子节点,那么一定是左子节点,完全二叉树中不存

weixin_48084293的博客 1869

基于Python实现学习进度跟踪系统

{{ task }}: {{ "%.1f"|format(hours) }}小时

寒寒豆豆软件公司的博客 196

GaussDB本地安装手册(主备模式)

如果实例状态是Normal,则安装成功。三节点集中式配置文件。

Sebastien23的博客 2636

详细图文——最大堆

二叉堆是一种特殊的堆,二叉堆是完全二叉树。本文讲解了最大堆的实现过程,尤其是堆的调整操作——siftUp和siftDown。阅读完本文您可以自己实现最大堆了。

带翅膀的猫的博客 1万+

web逆向伪瑞数案例:宝武资源有限公司(面向对象补环境)

声明:该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关前言:之所以称伪瑞数案例,是因为该网站,无论是补环境的方法、还是环境都和瑞数差不多,因为第一次遇到这种网站,不确定是不是瑞数的一种,所以这里称伪瑞数,有知道的道友,可以评论区评论下,共同进步。,这里就不做多介绍了1.瑞数中的是t​s,而该网站是_ss。2.外链js代码不能格式化,否则补环境时会遇到一个超过数组长度的报错。3.call执行后的虚拟文件中有超多的debugger。

老衲爱洗头的博客 2535

【堆和优先级队列】

二叉堆 堆的代码实现 最大堆代码实现 向最大堆中添加一个元素—siftUp操作 删除堆顶元素—siftDown操作 测试代码方法 heapify 堆化 优先级队列 自定义类型的优先级队列实现 Comparator接口——比较器

Word码鸭的博客 6741

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构与算法:最大堆

这里写自定义目录标题堆堆和普通树的区别二叉堆最大堆向堆中添加元素和SiftUp从堆中取出元素和siftDown完整的代码 堆 堆是用数组实现的二叉树,堆根据**“堆属性”来排序**,“堆属性”决定了树中节点的位置。 堆分为两种:最大堆和最小堆,两者的差别在于节点的排序方式。在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的**“堆属性”**,并且这个属性对堆中的每一个节点都成立。 根据这一属性,那么最大堆总是将其中的最大值存放在树的根节点。而对于最小

xylitolz的博客 672

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

React 第三十七章 Scheduler 最小堆算法

在 Scheduler 中,使用最小堆的数据结构在对任务进行排序。我们在学习 Scheduler 中最小堆算法之前,需要先了解什么是 二叉堆。

aXin_li的博客 1366

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

基于最大堆实现的优先队列

树的另一种存储形式 在之前的二分搜索树中,使用的是链式的存储方式来存放树中的结点,这里二叉堆我们可以使用二叉树的另一种存储形式——数组,因为二叉堆是一颗完全二叉树,

呆呆papa的博客 663

数据结构之堆和优先队列

目录 优先队列 为什么使用优先队列? 优先队列不同底层实现复杂度分析 ​堆的基本结构 ​实现一个底层数组的最大堆 向堆中添加元素和Sift Up 取出堆中的最大元素和Sift Down 基于堆的优先队列 优先队列的经典问题 LeetCode347 d 叉堆 d-ary heap(用的不多) ​索引堆(了解)二项堆(了解)斐波那契堆(了解)广义队列 优先队列 普通队列...

万物并作,吾以观复 359

最小堆c++实现

前言 恰逢春招面试时, 大厂们都会考察对基本数据结构的掌握情况。这里有一个重点就是利用数组实现堆。据说有些面试官会要求白板手写堆。虽然我们在编码过程中可以借助STL的优先队列来实现堆,但是掌握其原理还是很重要滴。 堆的实现 是时候搬出当年写数据结构的代码了。这里给了一4个最小堆的例子,而最大堆的实现与此例子差不多,故此处就不赘述了。 最小堆的定义 // // Created by Dell on 2019/12/15. // #include <iomanip> #include <i

andy dennis的博客 1209

「扫盲」数据结构 - 堆入门

:fire: 什么是堆:grey_question: 堆是一颗【完全二叉树】 堆的所有【根节点】“大于”【子节点】 这里的大于是可以定义的。 ​ 上图所示,都是满足堆上方的性质,一颗完全二叉树,所有的根节点大于子节点 ​ 上方展示的为最大堆(相应的也可以定义最小堆) 使用数组表示 因为堆满足完全二叉树的定义,所以堆可以使用数组来表示【上图所示】。 由上图得在 index 位置上的节点可以推倒出如下公式 parent(i) = i / 2 left chi

UNIQUE_XIAOXI的博客 263

CPython heapq 模块完全指南:最小堆与最大堆 API、优先队列实现与算法原理剖析

`heapq` 是 CPython 标准库中实现堆队列(即优先队列)算法的模块。无论你是要在海量数据中高效提取 Top-N、合并多个有序数据流,还是实现带动态更新的任务调度器,`heapq` 都能以纯 Python 接口配合 C 加速后端,提供 O(log n) 级别的插入与弹出能力。读完本文,你将全面掌握最小堆与最大堆的函数级 API、三类通用工具函数(`merge` / `nlargest`

gitblog_01053的博客 480

堆和优先队列 —— 个人解读

优先队列什么是优先队列堆的基本结构用数组存储二叉堆(最大堆) 什么是优先队列 普通队列:先进先出,后进后出 优先队列:出队顺序和入队顺序无关;和优先级相关 堆的基本结构 采用堆作为优先队列的底层是一种高效的实现,因为堆作为底层,时间复杂度入队和出队都是O(logn)级别。 二叉堆的性质: 堆中某个节点的值总是不大于其父节点的值 一个(最大)二叉堆是一个具有最大堆特性的完全二叉树。 二叉堆是可用于实现高效优先队列ADT的数据结构之一。在优先队中,每一个元素都有一个优先级并且一个高优先级的元素总是比低优

༄༊星河༣ 268

最大堆与最小堆与优先队列

堆的定义及其实现 最小堆:最小堆是一个关键码序列{ K0,K1,...Kn-1},它具有如下特性: Ki ≤K2i+1 Ki≤K2i十2 类似可以定义最大堆 堆的性质 可以看出是完全二叉树 堆中的数据是局部有序的,堆不唯一 兄弟节点之间没有限制 从逻辑结构来看堆实际上是树形结构 最小堆的类定义(ADT) template &lt;class T&gt; class MinHeap {...

weixin_34034261的博客 418

数据结构:优先队列和堆

数据结构:优先队列和堆优先队列的概念堆的基础表示二叉堆的代码结构⭐向堆中添加元素,Sift up方法的实现⭐向堆中取出元素,Sift Down方法的实现Heapify和Replace基于堆的优先队列 优先队列的概念 普通队列:先进先出;后进后出 优先队列:出队顺序和入队顺序没有关系;和优先级相关 队列中的元素是不断变化的,需要根据队列中元素的不断变化动态的调节队列的优先级 优先队列底层为什么选择堆...

weixin_40426972的博客 355

优先队列&堆

普通队列:先进先出;后进后出 优先队列:出队顺序和入队顺序无关;和优先级相关 1 优先队列 所以,使用堆实现优先队列比较好。 2 堆的基本结构 二叉堆Binary Heap 二叉堆是一棵完全二叉树; 堆中某个节点的值总是不大于其父节点的值; 最大堆(最小堆); 1)用数组存储二叉堆 从1开始存储: 从0开始存储: 2)节点索引计算 计算父节点索引: // 返回完全二叉树的数组表示...

喜欢吃冰棍de谷利文君的博客 245
上一篇: 由后缀表达式建立表达式树
下一篇: 递归求huffman树的叶子结点的加权路径长度wpl
mach7
博客等级 码龄15年 32粉丝 50原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值