基于大顶堆实现的最大优先级队列
来源:互联网 发布:汇航亿胜网络推手公司 编辑:程序博客网 时间:2024/05/22 17:22
最大优先级队列有着以下操作:
1.返回最大值:heap_maximum
2.去掉最大值并返回:heap_extract_max
3.将i的关键值增加到key:heap_increase_key
4.向优先队列中插入一个结点:max_heap_insert
算法代码及测试代码如下:
#include <stdio.h>#include <conio.h>#include <stdlib.h>#define MAX 1000//函数原型void max_heapify(int A[],int i,int length);void swap(int *a,int *b);int heap_maximum(int A[]);void build_max_heap(int A[],int n);int heap_extract_max(int A[],int &n);int parent(int i);void heap_increase_key(int A[],int i,int key);void max_heap_insert(int A[],int &n,int key);int main(){int test[MAX]={-1,5,4,6,9,8,7,2,3,1,10};//除test[0]外,10个测试数据int n=10;build_max_heap(test,10);//建立大顶堆int result=heap_extract_max(test,n);max_heap_insert(test,n,111);for(int i=1;i<11;i++)printf("%d ",test[i]);getch();}//保持大顶堆性质void max_heapify(int A[],int i,int length){int largest=i; //最大值的下标int sub_left=i<<1;//左子树根结点的坐标int sub_right=sub_left+1;//右子树根结点的坐标if(sub_left<=length && A[i]<A[sub_left])largest=sub_left;if(sub_right<=length && A[largest]<A[sub_right])largest=sub_right;if(largest!=i){swap(&A[largest],&A[i]);max_heapify(A,largest,length);}}//建堆void build_max_heap(int A[],int n){for(int i=(n>>1);i>=1;i--)max_heapify(A,i,n);}//交换void swap(int *a,int *b){int temp=*a;*a=*b;*b=temp;}//返回最大值int heap_maximum(int A[]){return A[1];}//去掉并返回最大值int heap_extract_max(int A[],int &n){int max=A[1];A[1]=A[n];//将最后一个数放到最前n--;max_heapify(A,1,n);return max;}//将i的关键值增加到key,key应该大于A[i]void heap_increase_key(int A[],int i,int key){if(A[i]>=key)printf("new key is smaller than or equal to current key!");else{A[i]=key;while(i>1 && A[i]>A[parent(i)]){swap(&A[i],&A[parent(i)]);i=parent(i);}}}//求parent结点的关键值int parent(int i){return i/2;}//向优先队列中插入一个结点void max_heap_insert(int A[],int &n,int key){A[++n]=-INT_MAX;heap_increase_key(A,n,key);}总结:最大优先级队列主要用于作业调度,当某一作业完成或被终端时,选择出具有最高优先级的作业。相对的还有最小优先级队列。
- 基于大顶堆实现的最大优先级队列
- 优先级队列的实现
- 优先级队列的实现
- 基于堆的优先级队列
- 基于数组的优先级队列
- 基于邻接表和优先级队列的Dijkstra算法实现
- java基于有序链表的优先级队列实现
- (五)使用最大堆实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- 如何基于RabbitMQ实现优先级队列
- java 编写的最大优先级队列
- java 编写的最大优先级队列
- 基于最大堆实现最大优先队列
- 关于优先级队列的实现
- 最简单的一些linux命令的基本的实现
- Yate开源软件Jabberclient模块实现注册openfire过程分析
- 阅读MCP2515数据手册后一些关于CAN总线的笔记
- Windows Azure 和必应地图通过交互的网站将Speilberg的“War Horse”的历史带进生活
- IE 浏览器版本判断
- 基于大顶堆实现的最大优先级队列
- uint8_t / uint16_t / uint32_t /uint64_t 数据类型
- linux tar打包解压详解
- typeid参数
- atmel9260上linux socketcan MCP2515调试笔记
- ubuntu11.10 安装 qt卡死
- ORACLE SQL性能优化系列 (二)
- SQL日期查询
- Valgrind的下载安装