下面的例子来自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 #include #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];

else

break;

}

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

下面是运行图示:

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

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

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

  2. 优先级队列(最大、最小堆)总结

    优先级队列 前言 一.优先级队列 二.与普通队列的对比 三.优先级队列的实现(最大堆) 1.最大堆的实现 2.优先级队列的实现 四.优先级队列的应用 1.创建优先级队列 2.使用优先级队列 五.使用优 ...

  3. C语言实现最小堆minheap(附完整源码)

    C语言实现最小堆minheap min_heap结构体 实现以下8个接口 最小堆minheap完整源码(定义,实现,main函数测试) min_heap结构体 typedef struct min_h ...

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

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

  5. java 链表 最小堆优先级队列_关于Java集合的小抄

    List ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值.默认第一次插入元 ...

  6. java队列优先级_优先级队列-Java的PriorityQueue与最小堆有何不同?

    来自Java文档 表示为平衡二进制堆的优先级队列:queue [n]的两个子级是queue [2 * n + 1]和queue [2 *(n + 1)]. 优先级队列由比较器或元素的自然顺序进行排序. ...

  7. java 链表 最小堆优先级队列_Java集合细说

    Java集合类图关系思维导图,带对号标志的为线程安全类. 各集合类相关区别详解: 0x01:List Set Map Queue的区别 List有序,可以多个元素引用相同的对象 Set无序,不重复,不 ...

  8. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

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

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

最新文章

  1. Centos目录及其常用处理命令
  2. STM32HAL库---串口中断接收时间管理机制
  3. 解决Can't connect to MySQL server on 'localhost' (10048)
  4. 更新系统后魔兽世界无法连接至服务器,《魔兽世界:熊猫人之谜》5.0launcher更新无法连接服务器解决方法...
  5. 面试八股文:你写过自定义任务调度器吗?
  6. SaltStack匹配target-第六篇
  7. Java讲课笔记29:Swing入门
  8. silverlight 加载大图片进度提示
  9. python点击按钮弹出新窗口_PyQt5点击button如何弹出新窗口?
  10. Fragment的知识总结
  11. 数论基本定理及应用(二)
  12. 《Lua程序设计》第7章 迭代器与泛型for 学习笔记
  13. Idea搭建springcloud(一)---服务注册与发现之Eureka
  14. Qt——多语言程序设计
  15. 中科银谷:企业工商数据工商查询API接口应该如何选择?
  16. 【Android安全】Android root原理及方案 | Magisk原理
  17. 每年10万被动收入目标分解 | 进击
  18. 面试官:谈谈你对geohash的理解和如何实现附近人功能呢?
  19. 品读余光中的诗--《在雨中等你》
  20. 网络之tcpdump命令

热门文章

  1. 陈曦:超低延迟下的实时合唱体验升级
  2. 【线上分享】基于人眼主观视觉的画质评价与提升
  3. 叶琰:AI压缩技术在追上传统编码技术
  4. 熊猫直播P2P分享率优化(下):ASN组网
  5. 《Go语言圣经》学习笔记 第十一章 测试
  6. Java多线程之CAS深入解析
  7. 微信基于时间序的海量存储扩展性与多机容灾能力提升
  8. 黑科技小程序,无需前台登记直接刷脸秒住酒店!
  9. 微服务架构系列二:密码强度评测的实现与实验
  10. Shell脚本中字符串的一些常用操作