最大堆/最小堆、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”返回堆中最小/最... 阅读详情

相关推荐

从零到一:RK3588嵌入式开发中的SDK与MPP集成实战解析

本文详细解析了RK3588嵌入式开发中SDK与MPP(Media Process Platform)的集成实战,涵盖开发环境构建、SDK架构解析、MPP集成关键技术点及常见问题诊断。通过Qt5.12.10交叉编译环境配置和硬件加速优化,帮助开发者高效完成嵌入式视觉项目开发,特别适合边缘计算应用场景。

weixin_29189381的博客 511

图解数据结构与算法

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

深入探索前端调试神器vConsole

vConsole作为一款前端调试神器,为前端开发者提供了一个便捷的调试解决方案。通过本文的介绍和示例,相信你已经对vConsole有了更深入的了解。然而,vConsole的功能远不止于此,它还有许多高级用法和技巧等待你去发掘。讨论:你在前端开发中是如何使用vConsole的?你有没有发现vConsole的一些隐藏功能或技巧?欢迎在评论区分享你的经验和见解!💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 8522

堆 之 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

Pentaho安装与配置

Pentaho安装与配置前言一、下载二、配置1.JDK环境2.添加mysql-jdbc驱动三、启动 前言 Pentaho Data Integration (PDI):前身是Kettle。Pentaho提供了提取、转换和加载(ETL)功能,该功能使用统一且与最终用户和物联网技术相关且可访问的格式简化了捕获、清理和存储数据的过程。 功能:提供报表的制作、分析、仪表板、数据集成、数据采集、商业智能平台等强大功能。 一、下载 官网地址:http://www.pentaho.com/ 不过已经访问不到了

小太阳DENGJIE的博客 3613

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和LWIP搞定RMII以太网(附复位与PHY地址避坑指南)

本文详细解析了STM32F407与LAN8720通过RMII接口实现以太网通信的完整流程,重点解决了网口不通的常见问题。从硬件连接到CubeMX配置,再到LWIP网络参数设置,提供了复位时序、PHY地址配置等关键细节的避坑指南,帮助开发者快速排查和解决以太网通信故障。

weixin_33695082的博客 419

算法 之 堆 - 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

[系统安全] 十一.那些年的熊猫烧香及PE病毒行为机理分析

如果你想成为一名逆向分析或恶意代码检测工程师,或者对系统安全非常感兴趣,就必须要认真分析一些恶意样本。熊猫烧香病毒就是一款非常具有代表性的病毒,当年造成了非常大的影响,并且也有一定技术手段。本文将详细讲解熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢!同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安

杨秀璋的专栏 7327

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

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

weixin_48084293的博客 1869

【项目实战】AES实施应符合NIST密码算法验证程序

AES由美国国家标准与技术研究院(NIST)制定。NIST是负责开发和维护美国政府使用的技术标准的机构,包括加密标准。

奶爸的编程之路,也就一周冷个三天 769

下载igv报错:Error loading genome hg38raw.githubusercontent.com...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 992

详细图文——最大堆

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

带翅膀的猫的博客 1万+

基于八叉树的k近邻搜索

在八叉树中,每个节点都表示一个正方体的体积元素(体素),并且每个节点都有八个子节点(在不为空的情况下)。搜索最近邻点:一旦确定了查询点在八叉树中的位置,就可以开始搜索最近邻点了。搜索过程通常从查询点所在的叶节点开始,并逐步扩展到相邻的叶节点和父节点,直到找到k个最近邻点为止。k近邻搜索的目标是在给定的点云数据中,找到一个查询点的k个最近邻点。定位查询点:在搜索过程中,首先需要确定查询点在八叉树中的位置。返回结果:最后,搜索算法会返回找到的k个最近邻点的索引和它们与查询点之间的距离。

twnkie的博客 674

【堆和优先级队列】

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

Word码鸭的博客 6741

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构与算法:最大堆

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

xylitolz的博客 672

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

aXin_li的博客 1366

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

呆呆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的博客 481

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

优先队列什么是优先队列堆的基本结构用数组存储二叉堆(最大堆) 什么是优先队列 普通队列:先进先出,后进后出 优先队列:出队顺序和入队顺序无关;和优先级相关 堆的基本结构 采用堆作为优先队列的底层是一种高效的实现,因为堆作为底层,时间复杂度入队和出队都是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、付费专栏及课程。

余额充值