【数据结构】堆(heap)

堆排序的实现原理分析(剖析上浮下沉操作, 让你重新认识堆排序) 网络上关于堆排序的算法博客多是给图给真相(因为翻了很多文章还是不清楚,堆排序的过程是什么?所以自己来搞),今天我介绍一下我对堆排序的理解及实战分析。 先介绍一下堆:它分最大堆和最小堆,二者的不同就是父节点和子节点的关系;最大堆要求父节点要比子节点大,而最小堆要求比父节点要比子节点小。其次是堆所依赖的数据结构,它本身是一颗完全二叉树,由于完全二叉树特性,父节点和左右子节点间位置的关... 阅读详情

1. 概述


1.1 性质


堆是一种完全二叉树(complete binary tree);若其高度为h,则1~h-1层都是满的。下图[1]给出了完全二叉树、非完全二叉树:


从左至右从上至下,从1开始给节点编号。作为完全二叉树,堆满足:

(a)节点i的父节点编号为i/2

(b)节点i的左右孩子节点编号分别为2*i, 2*i+1

为了便于操作,用数组作为堆的存储结构。


堆还满足:每一个父节点的关键值均不小于(不大于)其孩子节点的关键值,这样的堆被称为大顶堆(小顶堆)。


1.2 上浮和下沉


为保持堆的有序性,通常有两种操作:上浮、下沉。注:为了便于叙述,下面所提到的堆均指小顶堆。

上浮:子节点与其父节点进行比较,若子节点的关键值小于父节点的关键值,则进行交换;重复操作,直至不需要交换为止。

下沉:父节点与其子节点进行比较,若父节点的关键值大于子节点的关键值,则进行交换;重复操作,直至不需要交换为止。


1.3 插入


在进行插入操作时,先将元素插入队列尾,然后对插入的元素做上浮操作,保持堆的有序性。例子[2],


将2插入队列尾,2与父节点6比较,2小于6,需要交换……重复操作,直至不需要交换。


1.4 删除


将堆的根结点删除,将最右的叶子节点作为新的根结点;从根结点开始做下沉操作(为了保持堆的有序性)。动态演示参看[3]。



2. Referrence


[1] daoluan, 私房STL之一分钟的heap.

[2] Jiang Guogang, 图解数据结构(8)——二叉堆.

[3] Galles, min heap visualization.

[4] the learning point, heap (C source code).


3. 源代码


堆中插入元素、删除最小元素(即堆顶)

/*insert an element into the heap*/
void Insert(int x)
{
	int now;
	hsize++;
	h[hsize]=x;
	for(now=hsize;h[now/2]>x;now/=2)    //上浮
		h[now]=h[now/2];
	h[now]=x;
}

/*delete the minimum element heap[1]*/
void DeleteMin()
{
	int now,lastElement,child;
	lastElement=h[hsize--];
	for(now=1;2*now<=hsize;now=child)   //下沉
	{
		child=2*now;
		if(child<hsize&&h[child]>h[child+1])
			child++;
		if(h[child]<lastElement)
			h[now]=h[child];
		else 
			break;
	}
	h[now]=lastElement;
}




算法基础 -- 小根堆构建的两种方式:上浮法与下沉法 在构建小根堆时,常用的两种方法是上浮建堆和下沉建堆。上浮建堆通过逐个插入元素并进行上浮调整,时间复杂度为O(n log n),适用于动态增量插入的场景。下沉建堆则从最后一个非叶子节点开始,自底向上进行下沉调整,时间复杂度为O(n),适用于一次性构建堆的情况。下沉建堆由于避免了叶子节点的重复操作,效率更高。实际应用中,上浮建堆适合优先队列的逐个入队,而下沉建堆则常用于堆排序等一次性构建堆的场景。 阅读详情

相关推荐

500道C++面试高频题解析(附答案、实战示例与进阶追问)

本文提供500道C++面试高频题的详细解析,涵盖基础概念到进阶应用,包括面向对象编程、内存管理、现代C++特性、并发编程等核心考点。每道题配有实战示例和进阶追问,帮助开发者突破八股文局限,掌握解决实际问题的能力,适合准备C++技术面试的工程师系统复习。

weixin_29002595的博客 311

二叉堆的构建,上浮以及下沉

二叉堆本质上就是完全二叉树,分为两类 最大堆,所有的父节点都大于或等于它的左右孩子节点 最小堆,所有的父节点都小于或等于它的左右孩子节点 以下代码都是以最小堆为例 二叉堆的操作 二叉堆虽然是一个完全二叉树,但是它的存储方式并不是链式存储,而是顺序存储,它所有的节点都存储在数组中。 父节点与孩子节点,父节点与父节点的父节点在数组中坐标的关系推导 插入节点 插入的节点存放在二叉堆的最后一个位置,然后将这个节点与它的父节点比较,不满足最小堆性质的就将二者交换,这就是“上浮”,再与新的父节点比较,直至上浮到正

qq_58855682的博客 1372

模拟IC设计实战:折叠式共源共栅放大器的参数优化与噪声抑制

本文深入探讨了折叠式共源共栅放大器的核心设计要点。针对低电压下增益与输出摆幅的矛盾,文章详细阐述了从套筒式结构转向折叠式结构的必要性,并重点分析了其参数优化与噪声抑制的实战方法。通过手把手的参数计算流程,指导如何平衡增益、带宽、摆幅与功耗。同时,深入剖析了噪声来源,强调了采用PMOS输入对管以抑制1/f噪声,并提供了针对共栅管及电流镜的噪声优化策略,是模拟IC设计中高性能放大器设计的实用指南。

vv45678的博客 978

数据结构堆的基本操作实现

堆 其实就是一棵完全二叉树(见下图)在数组中的实现 堆分为大根堆和小根堆 大根堆:1.根节点最大 2.子节点必须大于等于父节点 小跟堆:1.根节点最小 2.子节点必须小于等于父节点 在数组中存储这种结构时,总是习惯将根节点存储在数组下标为1的位置 每一个下标为k的节点的父节点的下标就是k/2 每一个下标为k的节点的子节点的下标就是k2和k2+1 在对堆进行操作(插入或删除了一个元素)的时候,有时会打破堆的有序性,使得子节点和父节点之间的有序性被打破,这时候就需要重新恢复堆的有序性。 恢复堆的有序性需要

m0_50498666的博客 689

【2026年华为暑期实习(AI)-4月29日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要涵盖了机器学习和深度学习中的多个核心概念与技术,包括非负矩阵分解、条件数、MobileNet创新点、LDA降维、大模型评测指标、半精度训练、多任务学习、GPU存储层次、正则化、张量并行等。通过12道单选题和8道多选题的形式,系统性地考察了相关理论原理、应用场景及工程实践要点。题目设计注重概念准确性(如LDA目标函数)、技术细节(如Megatron-LM的并行策略)与实际应用(如FP16训练动机),并包含概率统计(二项分布)和数值计算(微分误差分析)等数学基础内容,全面检验读者对AI领域关键知识的掌握

m0_73659489的博客 143

复现论文《Analysis of circulating current mechanism of Grid-forming offshore wind farm based on DRU-HVDC》

该论文研究了基于二极管整流单元(DRU)和低频交流(LFAC)输电的构网型(GFM)海上风电场并网系统中环流的产生机理。由于 DRU 不可控,系统电压与频率依赖于风力发电机(WT)的网侧变流器,当多台 WT 并联运行时,因输出电压幅值、相位、输出阻抗或频率不匹配,会产生基频环流,导致系统损耗增加与稳定性下降。论文通过理论建模与 MATLAB/Simulink 仿真,分析了四种不平衡工况下的环流机理,并指出幅值不平衡和阻抗不平衡引起无功环流,相位不平衡引起有功环流,频率不平衡则引起环流振荡,为后续环流抑制研究

huanghm88的专栏 104

堆的插入与删除,上浮与下沉

这文章写的真棒!!!网上关于堆的文章里非常棒的一篇,比较全面,详细.在最大堆构造,堆排序,和最大堆维护的基础上,补充了堆的插入和删除,和其中用到的上浮,下沉等操作。 个人理解:最大堆维护是用元素A替换掉堆中某元素后通过最大堆维护操作使得该堆依然是最大堆. 而插入则是插入元素A后使得堆依然为最大堆的操作. 删除是删除堆中某元素后使得堆依然为最大堆的操作. 插入与删除的核心操作其实就是上浮与下

aiaiai010101的博客 6589

【雕爷学编程】一款功能强大、易于使用、适用范围广泛的嵌入式Python解释器:MicroPython

1、语法方面:Micropython与Python语法基本相同,但是由于Micropython是专门为嵌入式设备设计的,因此它对标准Python的功能进行了精简和优化,去掉了一些不必要的功能,同时增加了一些嵌入式系统特有的功能。3、库方面:Micropython与Python完全不同的是,它的标准库并不完全与Python的标准库一致,特别是一些底层库和硬件相关的库。5、丰富的库和工具支持:MicroPython有丰富的库和工具支持,如GPIO控制、网络连接、传感器数据采集等,可满足各种应用需求。

雕爷学编程 5194

数据结构之堆(Heap)

堆(Heap) 是一种基于完全二叉树结构的非线性数据结构

慢慢记录,慢慢更新。 1502

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1431

深入Netflix影片分类数据抓取的Python爬虫实战:反反爬机制绕过与Playwright应用全解析

技术工具用途Playwright控制真实浏览器模拟用户行为开发语言asyncio异步调度浏览器任务pandas数据处理和导出sqlite3本地数据库存储支持随机UA模拟,增强反爬能力为什么选择 Playwright?✅ 支持多浏览器(Chromium、Firefox、WebKit)✅ 原生支持 Python 异步编程✅ 提供截图、滚动模拟、验证码处理等高级功能✅ 反爬能力强,模拟真实用户访问。

2201_76125261的博客 1239

数据结构--堆(Heap)

堆(Heap) 本文主要介绍以下内容: Heap的实现 HeapSort(堆排序) 完善各种堆的函数接口 TopK经典问题 堆就是一棵完全二叉树。因为它的某些性质,我们可以用数组存储。 堆的性质 1 完全二叉树的性质。 (1)将根节点(树的最上面的结点)序号设为0,然后由左至右,由上至下编号。 (2)父节点编号若为i,左孩子编号为(21+1),右孩纸为(21+2); (3)孩子的编号为i,父亲的编号则为 (i-1)/2 ; 2 父节点大于等于(或者小于等于)所有的子孙。 父节点大于等于子孙的

qq_53558968的博客 3887

数据挖掘实战-基于长短期记忆网络(LSTM)的黄金价格预测模型 | 97% 准确度

本实验基于Kaggle上提供的从2013年到2023年的黄金价格数据集,运用长短期记忆网络(LSTM)构建了黄金价格预测模型。该数据集详细记录了每日的黄金价格信息,包括开盘价、收盘价、高点、低点和交易量等,为模型的训练提供了丰富的数据支持。

m0_64336780的博客 1万+

Java 【数据结构】 优先级队列(PriorityQueue)和堆(Heap)【神装】

Java中的PriorityQueue和堆这一主题时,我掌握了如何使用PriorityQueue类来实现堆的基本操作,包括插入和删除。这些操作对于解决许多实际问题都非常有用,尤其是在需要高效管理元素优先级的情况下。

2302_79806056的博客 3372

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Golang container包下heap(数据结构中的堆)的使用

mport "container/heap" heap包提供了对任意类型(实现了heap.Interface接口)的堆操作。(最小)堆是具有“每个节点都是以其为根的子树中最小值”属性的树。 一、堆的基本概念 堆是一种经过排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构中通常可以被看做是一棵树的数组对象。而且堆需要满足一下两个性质: (1)堆中某个...

weixin_42117918的博客 1976

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【数据结构】堆(Heap)详解

堆是一种非常重要的数据结构,具有独特的性质和高效的操作。它在堆排序、优先队列等算法和应用中有着广泛的应用。通过对堆的深入理解和掌握,我们可以更好地设计和实现高效的算法,解决各种实际问题。

A Charmer 的博客 4464

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构之堆(Heap)

堆是一种非常重要的数据结构,它结合了数组的连续存储优势和树结构的有序性。通过完全二叉树的性质,堆能够高效地支持插入、删除和查找操作,特别适合需要频繁获取最大或最小值的场景。理解堆的原理和实现对于算法设计和系统优化都具有重要意义。

d3y1`5 81_09 791

【数据结构】堆的实现(heap)

堆分为两种:最大堆和最小堆 最大堆:父节点的值比每一个子节点的值都要大。 最小堆,父节点的值比每一个子节点的值都要小。 heap实现: heap.h #include <stdio.h> #include <time.h> #include <stdlib.h> #include <assert.h> #include <string.h&gt...

Mmmmmmmrr的博客 252

【数据结构】堆(Heap)

就可以建成一个 (大 / 小) 堆。我们把数组中的第一个元素看作是一个堆剩余的元素依次插入到这个堆中。这跟堆的插入接口原理相同,就是向上调整。如果堆的创建过程使用向上调整算法,那么每次插入一个新元素时都需要进行一次向上调整操作,以确保新插入的元素能够满足堆的性质。【时间复杂度】假设堆中已经有 n 个元素,那么堆的高度 h = log₂(n+1),在插入一个新元素的过程中,需要进行的向上调整操作次数为 h-1,则 h = log₂(n+1) - 1,

Elena's Blog 6188

数据结构-堆(Heap)

数据结构-堆(Heap) 我认识的堆: 1.建立在完全二叉树的基础上 2.排序算法的一种,也是稳定效率最高的一种 3.可用于实现STL中的优先队列(priority_queue)  优先队列:一种特殊的队列,队列中元素出栈的顺序是按照元素的优先权大小,而不是元素入队的先后顺序 4.两类:       a.最大堆:            ①根的值大于左右子树的值   ...

[SZU_Crayon] 2万+

一文绝对弄懂堆(Heap)数据结构

我们将实现一个最大堆,即堆顶元素是最大值。private:// 用数组存储堆// 获取父节点索引// 获取左子节点索引// 获取右子节点索引// 上浮操作// 下沉操作public:// 插入元素// 删除堆顶元素// 获取堆顶元素// 打印堆(用于调试)heap:用数组存储堆。:获取父节点索引。:获取左子节点索引。:获取右子节点索引。:上浮操作,用于插入元素后调整堆。:下沉操作,用于删除堆顶元素后调整堆。:插入元素。:删除并返回堆顶元素。

m0_74107848的博客 534

数据结构—堆(Heap)的原理介绍以及Java代码的完全实现

详细介绍了—堆(Heap)这种数据结构的特点和原理,并且提供了Java代码的完全实现,包括大顶堆、小顶堆的构建,堆节点的添加、删除,大顶堆、小顶堆的排序等方法!

终生学习践行者 5952

【数据结构与算法】第44篇:堆(Heap)的实现

堆是一种特殊的完全二叉树,分为大根堆和小根堆,常用于实现优先队列。注意区分:堆区和数据结构堆是完全不同的概念——堆区是内存管理中的一块区域,而数据结构堆是组织数据的一种方式。这一篇我们实现基于动态数组的大根堆,支持插入(上浮)和删除最大值(下沉),并分析其时间复杂度。

2301_80672009的博客 665

数据结构-堆(heap)

堆(heap)也被称为优先队列(priority queue)。队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。而堆也是一样,在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的。这个优先顺序可以是元素的大小或者其他规则。

蜗牛君的奋斗史 5万+

【数据结构】堆(Heap)

堆(Heap)是一种特殊的非线性结构。堆中的元素是按完全二叉树的顺序存储方式存储在数组中。满足任意结点的值都大于等于左右子结点的值,叫做大堆,或者大根堆;反之,则是小堆,或者小根堆。

炸掉地球的博客 1573

数据结构之——堆(Heap)

堆(Heap) 堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象。 完全二叉树 既然说堆是完全二叉树,那么就得介绍下什么是完全二叉树 定义:若设二叉树的高度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,且第h层所有的节点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K,有N个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 若一棵二叉树至多只有最

chenyu-max 1322
上一篇: 【算法】广度优先搜索(BFS)II
下一篇: 【算法】模式匹配之KMP
浅唱书令
博客等级 码龄16年 310粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅唱书令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值