最大优先队列
来源:互联网 发布:重生之网络娱乐无错 编辑:程序博客网 时间:2024/05/21 08:41
最大优先队列
前言
堆排序是一种集插入排序和选择排序的有点于一身的排序算法,但是在后面能学习到更加好的快速排序算法,性能优于堆排序。堆这钟数据结构还有许多其他的用处,例如作为高效的优先队列。优先队列分为最大优先队列和最小优先队列,今天学习了如何用最大堆来实现最大优先队列。
优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。一个最大优先队列应该支持下面的四种操作:
- MAXIMUM(S):将集合S中的最大关键字的元素返回。
- EXTRACT_MAX(S):返回并去掉S中最大的元素。
- INCREASE_KEY(S,x,k):将集合S中的x元素关键字的值提升至k,假设k不小于原x的关键字值。
- INSERT(S,x):将元素x插入集合S中。
原理
最大优先队列是建立在最大堆上的,在上一篇中已经学习到了关于最大堆的一些知识。在进行上述的四种操作前需要建立一个最大堆。对四种操作的解析如下:
- MAXIMUM(S) : 根据最大堆的性质,拥有最大关键字值的一项永远在索引为0的地方,所以直接返回即可。
- EXTRACT_MAX(S) : 将最大项和堆中的最后一项交换值,并返回最大项,需要删除最大项,可以将整个堆的大小缩小一项,不用理会最后一项(最后一项即交换成了最大项),第一项变化后需要对最大堆进行调整,也就是上篇博客中提到的向下调整。
INCREASE_KEY(S,x,k) : 将元素x的关键字值提升到了k之后,x下面的子树肯定是没有被破坏的,向上不断和x的父节点比较关键字值,如果key(x)>key(parent(x)),则交换值。
INSERT(S,key) : 在最大堆的最后一项后面加上一项。赋值为key,之后需要进行的就是对整个堆的调整,即从最后一项开始进行上面的第三步操作(INCREASE_KEY(S,x,k))。
C语言实现
//针对节点i及其子树进行最大堆的调整void max_heapify(int* a, int i, int count){ int left_index , right_index ; int max_index = i; left_index = 2 * i + 1; right_index = left_index + 1; if ((left_index <= count) && (a[left_index] > a[max_index])) max_index = left_index; if ((right_index <= count) && (a[right_index] > a[max_index])) max_index = right_index; if (max_index != i) { int t = a[i]; a[i] = a[max_index]; a[max_index] = t; max_heapify(a, max_index, count); }}//建立最大堆void build_max_heap(int* a, int count){ for (int i = count / 2; i >= 0; i--) { //对每个子根节点进行堆调整 max_heapify(a, i, count); }}//返回优先度最大的对象int heap_maximum(int* a){ return a[0];}//返回并删除优先度最大的对象int heap_extract_max(int* a, int count){ if (count < 1) return -1; int max = a[0]; a[0] = a[count]; max_heapify(a, 0, count - 1); return max;}//增加元素的优先度void heap_increase_key(int* a, int i, int key){ if (a[i] >= key) return; a[i] = key; while (i > 0 && a[(i - 1) / 2] < a[i]) { int t = a[(i - 1) / 2]; a[(i - 1) / 2] = a[i]; a[i] = t; i = (i - 1) / 2; }}//插入元素int* heap_insert(int* a, int key, int count){ int* p = (int*)malloc((count + 1) * 2); for (int i = 0; i < count; i++) { p[i] = a[i]; } p[count] = -1; heap_increase_key(p, count, key); return p;}void main(){ int count, *p; printf("请输入需要排序的数的个数 :"); scanf_s("%d", &count); p = (int*)malloc(count * 2); printf("\n请输入需要排序的%d个数字:",count); for (int i = 0; i < count; i++) { scanf_s("%d", p+i); } //依据输入的一列数字,建出一个最大堆 build_max_heap(p, count - 1); printf("建立最大堆后的数组:"); for (int i = 0; i < count; i++) { printf("%d ", p[i]); } printf("\n\n"); printf("最大元素为:%d\n", heap_maximum(p)); printf("\n\n"); printf("弹出最大元素:%d, 当前堆为:", heap_extract_max(p, count - 1)); count--; for (int i = 0; i < count; i++) { printf("%d ", p[i]); } printf("\n\n"); printf("增大第5个元素的优先度为10, 当前堆为:"); heap_increase_key(p, 4, 10); for (int i = 0; i < count; i++) { printf("%d ", p[i]); } printf("\n\n"); printf("插入一个优先度为100的元素,当前堆为:"); p = heap_insert(p, 100, count); for (int i = 0; i < count + 1; i++) { printf("%d ", p[i]); } system("pause");}
0 0
- 最大最小优先队列
- 最大优先队列
- 最大优先队列
- 最大优先队列
- 最大堆与优先队列
- 算法导论-----最大优先队列
- 最大优先队列--【算法导论】
- Python实现最大优先队列
- 基于最大堆实现最大优先队列
- 最大堆及基于最大堆的最大优先队列
- 用最大堆实现优先队列
- 算法入门--最大堆实现优先队列
- heap实现的最大优先队列
- 优先队列及最小堆最大堆
- <C/C++算法>最大优先队列
- 优先队列及最大堆最小堆
- 堆排序_最大优先队列
- 堆排序和优先队列【最大堆】
- spring的IOC、AOP的使用场景
- 经验分享:一个产品经理花50万及半年时间买的教训
- ByteArrayOutputStream(字节数组输出流)的一个例子,与ByteArrayInputStream作一比较
- javaweb项目中中文乱码
- PATBasic——1018. 锤子剪刀布 (20)
- 最大优先队列
- 互联网产品开发中的“快”字诀
- tomcat日志中日期的转换
- 关于java正则
- 10条改善Java性能的小建议:
- 获取当前绑定项的Index
- opencv截取矩形框中的图像
- 不要忽视免费博客潜力 提升网站权重有技巧
- iphone 开发中使用zbar时遇到的几个典型问题解决方法。