二叉堆(binary heap)—— 优先队列的实现
2016-09-25 18:39
666 查看
二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现。
注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根?
本文给出的实现,以数组第 1 个位置上的元素作为根,则其两个孩子 ⇒ 2*i, 2*i+1
而第 0 个位置上的元素,则用来作为标志变量(Size 不包括此变量);
在元素逐个插入的过程中(插入在合适的位置),实现二叉堆的构建;自然删除也需按着指定的规则;
比较困难的是删除时,二叉堆结构在线性数组上的维持:
注意,数组第 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; }
相关文章推荐
- 自己写GoBinaryHead 二叉堆binaryheap实现优先队列(堆)
- 优先队列——二叉堆实现
- 使用二叉堆实现优先队列
- 二叉堆实现优先队列
- 数据结构之优先队列--二叉堆(Java实现)
- C#实现优先队列 基于二叉堆 附使用案例
- 优先队列--二叉堆实现
- 【数据结构与算法基础】优先队列(二叉堆实现) / Priority Queue implemented by binary heap
- 优先队列之二叉堆(JAVA实现)
- 优先队列(堆)——二叉堆的实现
- 用二叉堆实现优先队列
- 算法学习 - 优先队列的二叉堆实现
- PriorityBlockingQueue优先队列的二叉堆实现
- heap实现的最大优先队列
- 数据结构_使用二叉堆实现优先队列
- 二叉堆的实现和详解(优先队列的基础)
- min heap priority queue 最小堆实现的优先队列
- 【数据结构】实现大小堆也叫二叉堆(类似c++中的优先队列)
- 优先队列的简单实现-二叉堆实现
- 每日一省————使用二叉堆实现优先队列