下面的例子来自Weiss的《数据结构与算法分析:c语言描述》,自己亲自敲了一遍,跑了个demo,并将结果记录下来。

binheap.h的头文件声明

//description: 使最小堆实现优先级队列
//date: 2019-03-15#ifndef __BINHEAP_H__
#define __BINHEAP_H__typedef int ElementType;struct HeapStruct {int Capacity; //最大容量int Size; //当前大小ElementType *Elements; //元素数组
};typedef struct HeapStruct *PriorityQueue;PriorityQueue Initialize(int MaxElements);void Destroy(PriorityQueue H);void MakeEmpty(PriorityQueue H);int IsEmpty(PriorityQueue H);int IsFull(PriorityQueue H);void Insert(ElementType X, PriorityQueue H);ElementType DeleteMin(PriorityQueue H);ElementType FindMin(PriorityQueue H);#endif

binheap.c源码文件

#include "binheap.h"
#include <stdio.h>
#include <stdlib.h>#define MinData (-32767)
#define MinPQSize (10)PriorityQueue
Initialize(int MaxElements){PriorityQueue H;if(MaxElements < MinPQSize){printf("Priority queue size is too small");exit(-1);}H = malloc(sizeof(struct HeapStruct));if(H == NULL){printf("failed to alloc memory space for HeapStruct");exit(-1);}/* allocate the array plus one extra for sentinel  */H->Elements = malloc( (MaxElements+1) * sizeof(ElementType));if(H->Elements == NULL){printf("failed to allocate memory for Elements array");exit(-1);}H->Capacity = MaxElements;H->Size = 0;H->Elements[0] = MinData; //此处设置哨兵return H;
}void
Destroy(PriorityQueue H){free(H->Elements);free(H);
}void
MakeEmpty(PriorityQueue H){H->Size = 0;
}void
Insert(ElementType X, PriorityQueue H){int i;if(IsFull(H)){printf("Priority queue is full");return;}//从尾部向头部检查for(i=++H->Size; H->Elements[i/2]>X; i/=2){H->Elements[i] = H->Elements[i/2];}H->Elements[i] = X;
}ElementType
DeleteMin(PriorityQueue H){int i,Child;ElementType MinElement, LastElement;if(IsEmpty(H)){printf("FATAL: Priority queue is empty");return H->Elements[0];}MinElement = H->Elements[1];LastElement = H->Elements[H->Size--];for(i=1; i * 2 <= H->Size; i=Child){/*Find smaller child*/Child = i * 2;if(Child != H->Size && H->Elements[Child+1] < H->Elements[Child])Child++;/*Percolate one level *///此时最后一个元素已经在堆顶部了,头部与最后一个元素交换过了if(LastElement > H->Elements[Child])H->Elements[i] = H->Elements[Child];elsebreak;}H->Elements[i] = LastElement;return MinElement;
}ElementType
FindMin(PriorityQueue H){if(!IsEmpty(H))return H->Elements[1];printf("FATAL: Priority queue is Empty");return H->Elements[0];
}int
IsEmpty(PriorityQueue H){return H->Size == 0;
}int
IsFull(PriorityQueue H){return H->Size == H->Capacity;
}//=================================
int main(){int i, NUM=30;PriorityQueue pq = Initialize(NUM);for(i=0; i<NUM; i++)Insert(i, pq);while(!IsEmpty(pq)){i = DeleteMin(pq);printf("%d\n", i);}Destroy(pq);return 0;
}

下面是运行图示:

使用最小堆使用优先级队列(c语言版本)相关推荐

  1. 优先级队列 c语言,使用最小堆使用优先级队列(c语言版本)

    下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...

  2. 数据结构之堆(Heap),堆的相关操作,用堆模拟优先级队列

    目录 堆的概念 堆的存储方式 堆的相关操作 堆的向下调整. 堆的创建 堆的插入和向上调整 堆的删除 用堆模拟优先级队列 堆的概念 堆是逻辑结构为二叉树存储结构为数组数组的一种数据结构,为什么这么说呢? ...

  3. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  4. 堆和优先级队列3:不泡妹子都要会的LeetCode7道题之一

    我们前面费了那么大篇幅介绍堆和优先级队列,就是为了分析本文的7道题.而这7道题, 特别!特别!特别! 重要!重要!重要! 不过呢,正如我们前面说的,这些题目其实知道怎么处理就行,不必一定要写出来. 1 ...

  5. 《恋上数据结构第1季》二叉堆实现优先级队列

    优先级队列(Priority Queue) 优先级队列简介 优先队列的底层实现 二叉堆实现优先级队列源码 测试代码 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基 ...

  6. 《算法导论》第六章之堆和优先级队列相关算法C语言实现

    #include <stdio.h> int heap_size = 10; void max_heapify(int *A, int i){ //维持最大堆性质int l = 2 * i ...

  7. WebServer代码解读(3)【最小堆定时器与队列】

    文章目录 1 - 处理事件 1-1 接收新连接 1-2 最小堆定时器 1-4 将request加入线程池 1-5 处理request 1 - 处理事件 因为epoll_wait函数已经返回了需要处理的 ...

  8. 堆(优先级队列)及TOPK问题详解

    文章目录 1.二叉树的顺序存储 1.1存储方式 1.2下标关系 2.堆的应用:优先级队列(默认小根堆) 2.1概念 2.2Java中优先级队列的简单介绍 3.Topk问题 3.1求N个数中前k个最大/ ...

  9. 堆和优先级队列4:不泡妹子都要会的LeetCode7道题之二

    本文介绍的两个题比前面的更重要.这两个题的出现频率非常高,虽然每个题都还有多种方式,但是最正统的就是用堆来做.更有意思的是这两个题一般只说方案,不用手写.如果想清楚了就能应付一道面试题,何乐而不为呢? ...

最新文章

  1. openwrt安装oracle,Openwrt安装软件的方法-tomcat 随笔小记-install ubuntu 12.04 in virtualbox_169IT.COM...
  2. CreateProcess 重定向CMD实现反弹shell
  3. Microwindows及基于Nano-X的简单程序开发
  4. Teams的MessageExtension最新功能:Initiate actions
  5. easyui-datebox禁止手动输入
  6. matlab中的libsvm怎么录入数据啊,LibSVM在MATLAB中使用时的几个问题
  7. git 编辑提交的技巧
  8. [JSOI2009]瓶子和燃料【数论】
  9. vs2008 jquery 智能提示
  10. 如何将excel文件联系人转换成vcf文件
  11. java安装_Java开发人员应该知道的7种新工具
  12. 苹果手机怎么下载铃声
  13. 使用Cubic定制ubuntu系统
  14. 支付宝广告投放形式有哪些?支付宝广告的投放方向!
  15. 怎么查英文期刊,推荐一下?
  16. 玩转外贸LinkedIn必备的三大特质,以及突破六度人脉技巧
  17. cad考试题库绘图题答案_CAD考试试题库和参考答案解析
  18. Image Signal Processing(ISP)-第二章-Demosaic去马赛克以及BMP软件实现
  19. ckeditor+vue 傻瓜式操作教程
  20. 顿号、分号;这些标点符号的用法

热门文章

  1. Redis系列2- C#中使用Redis的示例
  2. 计算机房一般在办公楼建设吗,写字楼大厦机房建设技术方案.doc
  3. 安装配置解压版Mysql方法
  4. 笔记 - ES6 - 学前浅析
  5. 28自定义View 模仿联系人字母侧栏
  6. Java学习-jsp内置对象Session
  7. imagick API 中文说明
  8. BZOJ1202: [HNOI2005]狡猾的商人
  9. 杭电 HOJ 1312 Red and Black 解题报告
  10. DNN 数据访问策略 (转)