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

  • 注意,数组第 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];
else
break;
}
PQ->Elements[i] = LastElement;
return MinElement;
}

二叉堆(binary heap)—— 优先队列的实现的更多相关文章

  1. 二叉堆(binary heap)

    堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因 ...

  2. python---使用二叉堆实现的优先队列(列表)

    哟,有实用价值 可以看到,加入是随机的,而吐出是顺序的. # coding = utf-8 # 使用二叉堆实现的优先队列(列表) class BinaryHeap: def __init__(self ...

  3. 数据结构 之 二叉堆(Heap)

    注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的 ...

  4. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  5. Python实现二叉堆

    Python实现二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆: ...

  6. 堆(Heap)和二叉堆(Binary heap)

    堆(Heap) The operations commonly performed with a heap are: create-heap: create an empty heap heapify ...

  7. Binary Heap(二叉堆) - 堆排序

    这篇的主题主要是Heapsort(堆排序),下一篇ADT数据结构随笔再谈谈 - 优先队列(堆). 首先,我们先来了解一点与堆相关的东西.堆可以实现优先队列(Priority Queue),看到队列,我 ...

  8. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

    [0]README 0.1)为什么有这篇文章?因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构,即优先队列(二叉堆)的操作需要更改以适应这种新的数据结构,我们暂且吧它定义为Dista ...

  9. 【425】堆排序方法(二叉堆)优先队列(PQ)

    参考:漫画:什么是二叉堆? 大根堆 小根堆 参考:漫画:什么是堆排序? 参考:漫画:什么是优先队列? 参考:[video]视频--第14周10--第8章排序10--8.4选择排序3--堆排序2--堆调 ...

随机推荐

  1. 转载的:Python os 和 os.path模块详解

    os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os.curdi ...

  2. mysql 语句优化心得

    排序导致性能较慢 优化策略:1.尽量不使用排序 2.只查有索引的结果然后 内连接查询 select  bizchance0_.*  from biz_chance bizchance0_, biz_b ...

  3. GO语言学习(十七)Go 语言类型转换

    Go 语言类型转换 类型转换用于将一种数据类型的变量转换为另外一种类型的变量.Go 语言类型转换基本格式如下: type_name(expression) type_name 为类型,expressi ...

  4. SpringMVC学习总结(2)——SpringMVC返回json配置

    <!-- 避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" c ...

  5. Centos NFS 简单设置

    Server 端: NFS的安装配置:centos 5 :yum install nfs-utils portmapcentos 6 :yum install nfs-utils rpcbind vi ...

  6. Webpack学习手册

    多端阅读<Webpack官方文档>: 在PC/MAC上查看:下载w3cschool客户端,进入客户端后通过搜索当前教程手册的名称并下载,就可以查看当前离线教程文档.下载Webpack官方文 ...

  7. windows apache 跳转 tomcat 代理

    需求是这样的 服务器有tomcat和apache两个服务器 t端口号是8080,a端口是80 比如javaweb的域名是 www.XXX.com:8080 phpweb的域名是  a.XXX.com ...

  8. 每日技术总结:jquery datetimepicker,微博QQ好友QQ空间微信等分享接口

    前言: 1.jquery datetimepicker 今天遇到一个日期控件格式的问题,默认选中显示的并不是设定的值,而是当天的日期.于是去查了一遍文档. 参考文章:jquery datetimepi ...

  9. GCD下载后清除缓存

    //GCD下载后清除缓存1 —(void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; //清除缓存 [self.cache re ...

  10. [Angular 2] BYPASSING PROVIDERS IN ANGULAR 2

    Artical --> BYPASSING PROVIDERS IN ANGULAR 2 Here trying to solve one problem: On the left hand s ...