优先队列的实现(建堆)
来源:互联网 发布:淘宝 css 显示代码 编辑:程序博客网 时间:2024/06/06 00:18
参考书目《数据结构与算法分析(C语言描述)》
二叉堆是一颗完全二叉树,有最小堆和最大堆。优先队列同样具有堆序性,而它是用连续内存实现的(数组和动态申请内存),注意首元素的起始位置不同,会导致建堆存在一些差别。同时它也和队列的入队,出队例程相似,但是它对于出队的元素设定一些要求。在进程先后执行当中有用到。
//接口函数 结构定义
#ifndef _PRIOQUE_H#define _PRIOQUE_Hstruct HeapStruct{int Capacity;int Size;char *Elements;};typedef struct HeapStruct *PriorityQueue;PriorityQueue InitPQ(int MaxElements);void Destroy(PriorityQueue H);void MakeEmpty(PriorityQueue H);void Insert(char ch,PriorityQueue H);char DeleteMin(PriorityQueue H);char FindMin(PriorityQueue H);int IsEmpty(PriorityQueue H);int IsFull(PriorityQueue H);void Print(PriorityQueue H);#endif
//接口函数定义
#include <stdio.h>#include <stdlib.h>#include "prioque.h"#define MinPQSize 2#define MinData '\0'PriorityQueue InitPQ(int MaxElements){PriorityQueue H;if(MaxElements<MinPQSize){ printf("Priority queue is too small!!");return NULL;}H=(PriorityQueue)malloc(sizeof(struct HeapStruct));if(H==NULL)printf("Out of space!");H->Elements=(char *)malloc((MaxElements+1)*sizeof(char));if(H->Elements==NULL)printf("Still no space!");H->Capacity=MaxElements;H->Size=0;H->Elements[0]=MinData;return H;}void Insert(char ch,PriorityQueue H){int i;if(IsFull(H)){printf("Priority queue is full!");return;}for(i=++H->Size;H->Elements[i/2]>ch;i/=2) //将元素插入到合适位置H->Elements[i]=H->Elements[i/2];H->Elements[i]=ch;}char DeleteMin(PriorityQueue H){int i,Child;char MinElement,LastElement;if(IsEmpty(H)){printf("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)//将新元素下滤再次得到堆{Child=i*2;if(Child!=H->Size&&H->Elements[Child]>H->Elements[Child+1]) Child++;if(LastElement>H->Elements[Child])H->Elements[i]=H->Elements[Child];elsebreak;}H->Elements[i]=LastElement;return MinElement;}int IsEmpty(PriorityQueue H){if(H->Size==0)return 1;elsereturn 0;}int IsFull(PriorityQueue H){if(H->Size==H->Capacity)return 1;elsereturn 0;}void Destroy(PriorityQueue H){free(H->Elements);free(H);}void Print(PriorityQueue H){int i;for(i=1;i<=H->Size;i++){printf("%3c",H->Elements[i]);if(i%5==0)printf("\n");}}
//main函数入口
#include <stdio.h>#include "prioque.h"int main(int argc, char **argv){int i;char letter;PriorityQueue PQ;PQ=InitPQ(18);char buf[18]={'A','B','C','K','L','S','G','X','Z','G','H','E','F','J','D','N','P','O'};for(i=0;i<18;i++) //通过多次插入来建立堆{Insert(buf[i],PQ);}Print(PQ);letter=DeleteMin(PQ);printf("\nDelete letter is %c!\n",letter);Print(PQ);printf("\nNext is %c!\n",DeleteMin(PQ));Print(PQ);Destroy(PQ);return 0;}
测试结果
0 0
- 优先队列的实现(建堆)
- 堆的实现、堆排序、优先队列
- 优先队列实现堆
- 优先队列(堆实现)
- 基于堆的优先队列的实现
- 堆和优先队列的实现
- 基于堆的优先队列实现
- 从堆到优先队列的实现
- 优先队列的实现--二叉堆
- 堆排和优先队列的实现
- 用堆实现的优先队列
- 数据结构--优先队列(堆)的实现
- 从堆到优先队列的实现
- 优先队列的数组、二叉堆实现
- 堆的实现与优先队列
- 最大堆及优先队列的实现
- 优先队列(堆)——二叉堆的实现
- 堆的实现(大小堆及 优先队列)
- POJ1111【BFS】
- 图像加载框架比较
- HDU1323 Perfection
- 老毛桃一键还原,安全高效 稳定可靠 全面兼容WINDOWS系统。本程序基于Ghost(v11.02)内核,具有良好的安全和稳定性,真正达到快速备份还原;全面支持和兼容32位和64位的Windows等主
- ”交集“选择器和“并集”选择器
- 优先队列的实现(建堆)
- 基础知识——接口和抽象类
- C#winform UDP通信 发送和接收信息
- 线程
- Linux批量添加用户
- SIA实战(三):为bean动态的增加新方法
- HDU - 3652 数位dp水题
- 2017.02.14总结
- CppQuiz系列 1