优先队列(堆实现)

优先队列由二叉堆实现是很普遍的事情。

下面我把二叉堆也称作为堆。

堆是一棵被完全填满的二叉树,一棵高为h的二叉树2h到2h+1-1个节点。这意味着完全二叉树的高时log N。

因为完全二叉树很有规律,所有它可以用一个数组来表示,而不需要指针

对于这棵树,我们可以这样表示。

  

对于数组中任意一个位置 i 上的元素,其左儿子在位置 2 i 上,右儿子在左儿子后的单元(2 i + 1 ),它的父亲则在位置( i / 2 )上。

 1 #ifndef _BinHeap_H
 2
 3 struct HeapStruct;
 4
 5 typedef int ElementType
 6
 7 typedef struct HeapStruct *PriorityQueue;
 8
 9 PriorityQueue Initialize (int MaxElenments);
10
11 void Destroy(PriorityQueue H);
12
13 void MakeEmpty(PriorityQueue H);
14
15 void Insert(ElementType X,PriorityQueue H);
16
17 ElementType DeleteMin(PriorityQueue H);
18
19 ElementType Find(PriorityQueue H);
20
21 int IsEmpty(PriorityQueue H);
22
23 int Is Full (PriorityQueue H);
24
25
26 #endif // _BinHeap_H
27
28 struct HeapStruct{
29     int Capacity;
30     int Size;
31     ElementType *Elements;
32 };
 1 //对堆进行初始化
 2 PriorityQueue Initialize(int MaxElements)
 3 {
 4     PriorityQueue H;
 5
 6     if(MaxElements < MinPQsize)
 7         Error("Priority queue size is too small");
 8
 9     H = malloc(sizeof( struct HeapStruct));   //H等于HeapStruct的内存大小,malloc是向系统申请一个内存空间。
10     if(H == NULL)
11         FatelError ("Out of space!!!");
12     H->Elements = malloc((MaxElements+1)*sizeof(ElementType));  //申请一个内存空间,之后就可以像数组一样对Elements进行操作。
13
14
15     if(H->Elements == NULL)
16         FatalError("Out of space!!!");   //H没有子节点了。
17
18     H->Capacity = MaxElements;
19     H->Size = 0;
20     H->Elements[0] = MinDate
21
22     return H;
23 }
 1 // 插入元素
 2
 3 void Insert(ElementType X, PriorityQueue H )
 4 {
 5     int i;
 6     if(IsFull(H))
 7     {
 8         Error("Priority queue is full");
 9         return ;
10     }
11     for(int i = ++H->Size;H->Elements[i/2]>X;i /= 2)   //采用冒泡,一个冒上去。
12         H->Elements[i] = H->Elements[i/2];    //如果它比它的父亲节点小的话,那么冒泡上去。
13     H->Elements[i] = X;
14 } 
 1 //删除最小值
 2
 3 ElementType DeleteMin( PriorityQueue H )
 4 {
 5     int i,Child;
 6     ElemenType MinElement , LastElement;
 7
 8     if(IsEmpty( H ))
 9     {
10         Error("Priority queue is empty");
11         return H->Elements[ 0 ];
12     }
13     MinElement = H->Elements[ 1 ];
14     LastElement = H->Elements[ H->Size-- ];
15
16     for( i = 1;i * 2 <= H->Size; i = Child )     //将每一个子节点的最小值上升到原来的父亲节点。
17     {
18         Child = i * 2;
19         if( Child != H->Size && H->Elements[ Child+1 ]
20                              <  H->Elements[ Child ] )
21             Child++;
22
23         if( LastElement > H->Elements[ Child ])
24             H->Elements[i] = H->Elements[ Child ];
25         else
26             break;
27     }
28     H->Elements[ i ] = LastElement;
29     return MinElement;
30
31 }
时间: 2024-10-14 22:02:27

优先队列(堆实现)的相关文章

优先队列(堆)

优先队列(priority queue)是允许至少两种操作的数据结构:Insert及DeleteMin(删除最小者).相当于队列中的Enqueue.Dequeue操作. 优先队列可以用链表.二叉查找树.二叉堆等实现. 二叉堆 1. 结构性质 堆(heap)是一棵完全被填满的二叉树,有可能的例外是在底层,底层上的元素从左向右填入.这样的树称之为完全二叉树. 一棵高为h的完全二叉树有2h到2h+1-1个节点.完全二叉树的高为logN. 完全二叉树可以用数组来表示,如果从0开始,对于数组中任意i位置的

优先队列(堆)&#183;二项队列

目录 一. 定义 二. 结构 三. 操作 3.1. 合并 3.1. 删除最小值(deleteMin) 四. 二项队列的实现 代码地址 一. 定义 ? 我们知道,左式堆每次操作的时间界是\(O(logN)\).二项队列支持合并.插入.删除最小值,每次插入的平均时间为常数时间,而最坏时间是\(O(logN)\). ? 二项队列: 不是一棵堆序的树,而是堆序的树的集合,成为森林. 森林的每棵树都是二项树(binomial tree). 每个高度上至多存在一棵二项树. 二. 结构 ? 结构图解: ? 高

stl 优先队列(堆)

[模板]堆 题目描述 如题,初始小根堆为空,我们需要支持以下3种操作: 操作1: 1 x 表示将x插入到堆中 操作2: 2 输出该小根堆内的最小数 操作3: 3 删除该小根堆内的最小数 输入输出格式 输入格式: 第一行包含一个整数N,表示操作的个数 接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下: 操作1: 1 x 操作2: 2 操作3: 3 输出格式: 包含若干行正整数,每行依次对应一个操作2的结果. 输入输出样例 输入样例#1: 5 1 2 1 5 2 3 2 输出样例#1:

优先队列(堆)的实现

堆的插入/删除/打印操作 #include<iostream> #include<vector> #include<math.h> using namespace std; //堆的插入 vector<int> insert(int x,vector<int> heap) { int temp; if(heap.empty()) { heap.push_back(x); } else { heap.push_back(x); for(int i=

Expedition---poj2431(优先队列-堆)

题目链接:http://poj.org/problem?id=2431 题意:一辆卡车需要行驶 L 距离,车上油的含量为 P,在行驶的过程中有 n 个加油站 #include<stdio.h> #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> #define N 11000 #define INF 0x3f3f3f3f using namespace

Dijkstra+优先队列 堆优化

代码 #include <cstdio> #include <queue> #include <vector> #define MAXN 200010 #define INF 0x3fffffff using namespace std; struct edge{ int v,w; edge(int v, int w):v(v),w(w){} }; vector <edge> mp[MAXN]; int dis[MAXN]; bool vis[MAXN];

优先队列(堆) Priority Queue

Priority Queue Definition & Description: In computer science/data structures, a priority queue is an abstract data type which is like a regular queue or stack data structure, but where additionally each element has a "priority" associated wi

优先队列实现定时器

http://www.cnblogs.com/lewiskyo/p/6359789.html 上文介绍了使用数组实现定时器,但因为插入和删除定时器的效率太低,所以这里改用优先队列实现一次. 实现代码如下: 1 #include <iostream> 2 #include <sys/time.h> 3 #include <unistd.h> 4 #include <thread> 5 #include <vector> 6 #include <

优先队列和堆排序

优先队列 堆 1 基于堆的算法 初始化 自底向上堆化 自顶向下堆化 插入删除一项 2 堆排序 优先队列全部代码 1 优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (largest-in,first-out)的行为特征. 优先队列支持两种基本操作:向优先队列中插入一个新的数据项,删除(最大)优先队列中关键字最大的数据项. 优先队列具有很好的灵活性,能支持的操作: -

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算