二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现。

  • 注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根?

    • 本文给出的实现,以数组第 1 个位置上的元素作为根,则其两个孩子 ⇒ 2*i, 2*i+1
    • 而第 0 个位置上的元素,则用来作为标志变量(Size 不包括此变量);
  • 在元素逐个插入的过程中(插入在合适的位置),实现二叉堆的构建;自然删除也需按着指定的规则;

1. 声明

struct HeapStruct;
typedef struct HeapStruct* PriorityQueue;PriorityQueue Init(int MaxElements);
...
void Insert(ElementType X, PriorityQueue PQ);
ElementType DeleteMin(PriorityQueue PQ);

2. 实现

struct HeapStruct {int Capacity;int Size;ElementType* Elements;
};PriorityQueue Init(int MaxElements){PriorityQueue PQ;PQ = (PriorityQueue)malloc(sizeof(struct HeapStruct));if (!PQ) ....PQ->Elements = (ElementType)malloc(MaxElements*sizeof(ElementType));if (!PQ) ...PQ->Capacity = MaxElements;PQ-Size = 0;PQ->Elements[0] = INT_MIN;
}void Insert(ElementType X, PriorityQueue PQ) {if (IsFull(PQ)) ...for (int i = ++PQ->Size; PQ->Elements[i/2] > X; i /= 2) {PQ->Elements[i] = PQ->Elements[i/2];}PQ->Elements[i] = X;
}

比较困难的是删除时,二叉堆结构在线性数组上的维持:

ElementType DeleteMin(PriorityQueue PQ) {if (IsEmpty(PQ)) ...ElementType MinElement, LastElement;MinElement = PQ->Elements[1];LastElement = PQ->Elements[PQ->Size--];int Child;for (int i = 1; i*2 <= PQ->Size; ++i) {Child = 2*i;if (Child != PQ->Size && PQ->Elements[Child+1] < PQ->Elements[Child])Child = Child + 1;if (PQ->Elements[Child] < LastElement)PQ->Element[i] = PQ->Elements[Child];elsebreak;}PQ->Elements[i] = LastElement;return MinElement;
}

二叉堆(binary heap)—— 优先队列的实现相关推荐

  1. C++二叉堆binary heap (附完整源码)

    二叉堆binary heap 二叉堆binary heap 算法的完整源码(定义,实现,main函数测试) 二叉堆binary heap 算法的完整源码(定义,实现,main函数测试) #includ ...

  2. 看动画学算法之:二叉堆Binary Heap

    文章目录 简介 二叉堆的特性 二叉堆的作用 二叉堆的构建 获取二叉堆的最大值 二叉堆的插入 insert操作的时间复杂度 二叉堆的提取Max操作 extractMax的时间复杂度 创建二叉堆 简介 我 ...

  3. 二叉堆时间复杂度 php,二叉堆(Binary Heap)

    二叉堆这个数据结构有点意思,自己做了个总结,内容结构如下: 二叉堆性质 二叉堆操作 应用 二叉堆性质: 堆(Heap)是一个可以被看成近似完全二叉树的结构,具有完全二叉树的特性: 缺少的叶子节点总是位 ...

  4. 二叉堆与自定义优先队列实现删除任意元素

    二叉堆与自定义优先队列实现删除任意元素 堆Heap 二叉堆Binary Heap 二叉堆 二叉堆的实现 插入(insert) 取出堆顶(extract / delete max) 优先队列(Prior ...

  5. 利用二叉堆实现最小优先队列

    利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...

  6. python优先队列的库,python优先队列及二叉堆的实现

    python优先队列及二叉堆的实现 发布于 2015-12-18 06:55:17 | 117 次阅读 | 评论: 0 | 来源: PHPERZ Python编程语言Python 是一种面向对象.解释 ...

  7. python最大堆_二叉堆 及 大根堆的python实现

    Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...

  8. 数据结构之优先队列--二叉堆(Java实现)

    前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...

  9. 优先队列与相关题目(Python、二叉堆)

    1. 优先队列知识 1.1 优先队列简介 优先队列:一种特殊的队列.在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除. 优先队列与普通队列最大的不同点在于出队顺序 普通队 ...

  10. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

最新文章

  1. 企业中的混乱:如何对云计算具有信心
  2. Glib 对 C 函数进行单元测试
  3. Linux进程编程(PS: exec族函数、system、popen函数)
  4. js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)
  5. Maya+3dsMax三维建模
  6. HTML - label (转)
  7. 拯救天使 (BFS)
  8. PMP-PMBOK(第六版)--49个过程ITTO记忆口诀(第一辑)
  9. 经纬度 度分秒 正则表达式
  10. WORD导出PDF生成书签
  11. QQ连连看外挂核心算法(检测两点能否连通)
  12. python现在版本强势英雄_当前版本中后期强势英雄排行榜,第一名后期无敌!
  13. T2695 桶哥的问题——吃桶
  14. 计算机知识小口诀,字根表口诀怎么快速背-小学数学:一年级20以内加减法口诀表,附背诵技巧!...
  15. 【无标题】三星Xpress M2020打印机刷免芯片
  16. 大疆校招和社招 各岗位内推码--更新20220717
  17. PWM、SPWM、SVPWM的个人理解
  18. 【仓库物资识别】二、将三维点云转换成二维图像
  19. Ubuntu下Firefox无法打开localhost:5560/isqlplus解决办法
  20. Ambient Occlusion 环境光遮蔽 后期处理系列4

热门文章

  1. 骨架屏 (Skeleton Screen)
  2. 计算机网络-自顶向下方法(7th) 第一章 Review Questions 中英对照
  3. java与android https,Java-Android SSL https发布
  4. Sklearn——Sklearn的介绍与安装
  5. Nvidia-Docker
  6. Qt总结之二十三:QByteArray与char、int、float(及其数组)之间的互相转化
  7. sqlserver没有ldf附加数据库
  8. 关于svn服务部署方案
  9. 遊戲是這樣寫成的 (第三篇: 簡單的遊戲框架)
  10. position小结