数据结构 - 堆(Heap)

1.堆的定义

堆的形式满足完全二叉树的定义:

  • i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点
  • 叶子节点只可能在最大的两层出现,而最大层次上的叶子节点都依次排列在该层最左侧的位置上
  • 如果有度为1的节点,那么只可能有一个,且该节点只有左孩子

根据堆定义的不同,分为大根堆和小根堆:

  • 大根堆每个节点的值都大于其子节点的值
  • 小根堆每个节点的值都小于其子节点的值

除此之外还有一个重要的内容

  • 单节点也符合堆的特质

2.堆的初始化

堆的初始化可以可以分为如下几个步骤(以初始化最大根堆为例):

  1. 首先初始化为完全二叉树形式。

  2. 从最后一个具有孩子节点的节点进行调整,如果以该元素为根的子树是最大根堆,则不进行操作,否则将该子树调整为最大根堆(调整思路为不断与子节点进行比较和交换,直至满足最大根堆要求为止)。

  3. 数组:[2,7,26,25,19,17,90,3],初始化为完全二叉树形式。

  1. 调整最后一个具有孩子节点的节点[4],符合最大根堆要求,不进行操作。

  1. 调整节点[3],以满足最大根堆要求,交换[3][7]

  1. 调整节点[2],以满足最大根堆要求,交换[2][5]

  1. 调整节点[1],以满足最大根堆要求,交换[1][3]后继续交换[3][7],最终完成初始化,满足最大根堆要求。

3.堆节点的插入和调整

如上图所示,在如上所示图中插入44

  1. 堆的初始化和插入的C++语言代码描述
/**
*@Author : Kindear
*@Intro : DataStrcut C++ Code 以最大根堆为例
**/
#include <bits/stdc++.h>
#define ARR_SIZE 20
using namespace std;
typedef int ElementType;
void AdjustUp(ElementType A[],int k, int len) //该方法用于堆插入调整
{
int Tmp = A[k]; //暂存k位置的数值
int i = k/2; //父节点的下标
while(i > 0 && A[i] < Tmp)
{
//如果该节点大于父节点,那么就交换两者的位置,满足最大根堆的要求
A[k] = A[i];
k = i;
i = k/2; //继续向上寻找并调整,直至满足最大根堆要求
}
A[k] = Tmp; //
}
void AdjustDown(ElementType A[],int k,int len) //该方法用于堆的初始化
{
int Tmp = A[k];
for(int i = 2*k; i <= len; i*=2) //向下筛选
{
if(i < len && A[i] < A[i+1]) i++;
if(Tmp > A[i]) break;
else
{
A[k] = A[i];
k = i;
}
}
A[k] = Tmp;
}
void BuildMaxHeap(ElementType A[],int len)
{
for(int i= len/2 ; i > 0; i--)
{
AdjustDown(A,i,len);
}
}
void PrintfElementArray(ElementType A[],int len)
{
for(int i=1;i<=len;i++)
{
printf("%d%c",A[i],i==len?'\n':' ');
}
}
int main()
{
ElementType A[] = {0,2,7,26,25,19,17,90,3};
ElementType B[ARR_SIZE];
BuildMaxHeap(A,8);
PrintfElementArray(A,8);
for(int i=0;i<=8;i++)
{
B[i] = A[i];
}
B[9] = 44;//插入44
AdjustUp(B,9,9);
PrintfElementArray(B,9);
}
参考文档

[1] 数据结构堆可视化:https://visualgo.net/zh/heap

数据结构 - 堆(Heap)的更多相关文章

  1. 基本数据结构——堆(Heap)的基本概念及其操作

    基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

  2. 数据结构&堆&heap&priority_queue&实现

    目录 什么是堆? 大根堆 小根堆 堆的操作 STL queue 什么是堆? 堆是一种数据结构,可以用来实现优先队列 大根堆 大根堆,顾名思义就是根节点最大.我们先用小根堆的建堆过程学习堆的思想. 小根 ...

  3. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  4. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  5. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  6. Java中堆(heap)和栈(stack)的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

  7. 数据结构-堆 Java实现

    数据结构-堆 Java实现. 实现堆自动增长 /** * 数据结构-堆. 自动增长 * */ public class Heap<T extends Comparable> { priva ...

  8. 纸上谈兵: 堆 (heap)

    纸上谈兵: 堆 (heap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...

  9. C 数据结构堆

    引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...

随机推荐

  1. Sublime Text3 个人使用安装设置

    1 安装Package Control 自动安装: 点击 View > Show Console 输入以下代码并运行 import urllib.request,os,hashlib; h = ...

  2. 区块链入门到实战(35)之Solidity – 变量作用域

    局部变量的作用域仅限于定义它们的函数,但是状态变量可以有三种作用域类型. Public – 公共状态变量可以在内部访问,也可以通过消息访问.对于公共状态变量,将生成一个自动getter函数. Inte ...

  3. MySQL 索引结构

    谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...

  4. React_TODOList 数据增删改查

    ①.功能代码实现: 添加数据 查询数据,展示 删除数据 修改数据 ②.数据持久化操作 localStorage.setItem('key',value) var value = localStorag ...

  5. 扫描仪文字识别ORC软件加强版(文通慧视完整版)下载

    http://www.wocaoseo.com/thread-300-1-1.html 扫描文字识别软件想必做seo的都知道是做什么用的,但是目前免费的OR大多不太好用或者说不够功能强大,因为这些软件 ...

  6. TCP/IP网络编程之数据包协议

    一.概要 在了解了网络字节序之后,接下来就是要讲最最重点的消息协议.数据包是什么呢,数据包可以理解为两个人讲电话说的每一句话的内容.通过大家约定好的方式去理解.达到只有接听电话两个人才懂的东西.在程序 ...

  7. 都2020年了,还再问GET和POST的区别?【深度好文】

    最近看了一些同学的面经,发现无论什么技术岗位,还是会问到 get 和 post 的区别,而搜索出来的答案并不能让我们装得一手好逼,那就让我们从 HTTP 报文的角度来撸一波,从而搞明白他们的区别. 一 ...

  8. js实现csv下载

    var TableDatas  = '数据源';function getCSV(){ if(this.TableDatas.length === 0){ alert("没有数据呀呀呀呀!&q ...

  9. Python 快速验证代理IP是否有效

    有时候,我们需要用到代理IP,比如在爬虫的时候,但是得到了IP之后,可能不知道怎么验证这些IP是不是有效的,这时候我们可以使用Python携带该IP来模拟访问某一个网站,如果多次未成功访问,则说明这个 ...

  10. 【Android】AndroidStudio关于EventBus报错解决方法its super classes have no public methods with the @Subscribe

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先说明,以前我用eventBus的 ...