pta Percolate Up and Down(最小堆的插入维护和删除维护)
Write the routines to do a “percolate up” and a “percolate down” in a binary min-heap.
Format of functions:
void PercolateUp( int p, PriorityQueue H );
void PercolateDown( int p, PriorityQueue H );
where int p is the position of the element, and PriorityQueue is defined as the following:
typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {ElementType *Elements;int Capacity;int Size;
};
Sample program of judge:
#include <stdio.h>
#include <stdlib.h>typedef int ElementType;
#define MinData -1typedef struct HeapStruct *PriorityQueue;
struct HeapStruct {ElementType *Elements;int Capacity;int Size;
};PriorityQueue Initialize( int MaxElements ); /* details omitted */void PercolateUp( int p, PriorityQueue H );
void PercolateDown( int p, PriorityQueue H );void Insert( ElementType X, PriorityQueue H )
{int p = ++H->Size;H->Elements[p] = X;PercolateUp( p, H );
}ElementType DeleteMin( PriorityQueue H )
{ ElementType MinElement; MinElement = H->Elements[1];H->Elements[1] = H->Elements[H->Size--];PercolateDown( 1, H );return MinElement;
}int main()
{int n, i, op, X;PriorityQueue H;scanf("%d", &n);H = Initialize(n);for ( i=0; i<n; i++ ) {scanf("%d", &op);switch( op ) {case 1:scanf("%d", &X);Insert(X, H);break;case 0:printf("%d ", DeleteMin(H));break;}}printf("\nInside H:");for ( i=1; i<=H->Size; i++ )printf(" %d", H->Elements[i]);return 0;
}/* Your function will be put here */
Sample Input:
9
1 10
1 5
1 2
0
1 9
1 1
1 4
0
0
Sample Output:
2 1 4
Inside H: 5 10 9
思路:
题目让实现最小堆的插入维护和删除维护。只要记住最小的在上面就行。
另外要注意down的时候可能只有一个儿子。
代码:
void PercolateDown( int p, PriorityQueue H )
{ if(p<<1 > H->Size)return;int replace;if(p<<1+1 <= H->Size)replace = (H->Elements[p<<1] < H->Elements[p<<1+1] ? p<<1 : p<<1+1);else replace = p<<1;if(H->Elements[replace] < H->Elements[p]){int mid = H->Elements[replace];H->Elements[replace] = H->Elements[p];H->Elements[p] = mid;PercolateDown( replace, H );}
}void PercolateUp( int p, PriorityQueue H )
{if(p == 1)return;if(p&1){if(H->Elements[(p-1)>>1] > H->Elements[p]){int mid = H->Elements[(p-1)>>1];H->Elements[(p-1)>>1] = H->Elements[p];H->Elements[p] = mid;PercolateUp( (p-1)>>1, H );}}else{if(H->Elements[p>>1] > H->Elements[p]){int mid = H->Elements[p>>1];H->Elements[p>>1] = H->Elements[p];H->Elements[p] = mid;PercolateUp( p>>1, H );}}
}
转载于:https://www.cnblogs.com/vocaloid01/p/9514204.html
pta Percolate Up and Down(最小堆的插入维护和删除维护)相关推荐
- C++实现最大堆最小堆
目录 堆和栈的区别 最大堆与最小堆 最大堆的操作 最大堆的插入操作 最大堆的弹出操作 最大堆的C++代码实现 最小堆概念 最小堆的插入操作 最小堆的弹出操作 最小堆的C++代码实现 最大堆最小堆的应用 ...
- java 最小堆_堆排序 最大堆 最小堆 Java 实现
堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...
- python 最小堆类型: heapq
目录 1.heapq 的常用方法 2.几个例子 a.最小堆的创建以及增删 b.如何使用 heapq 创建最大堆 c.获取第 k 大/第 k 小数据 d.列表中的元素是元组 heapq 是 python ...
- 最大堆与最小堆的实现
最近算法课作业是最小堆,于是便顺便写了这个代码 最(大)小堆的性质: (1)是一颗完全二叉树,遵循完全二叉树的所有性质. (2)父节点的键值(大于)小于等于子节点的键值 (3)在堆排序中我们通常用的是 ...
- 最大堆,最小堆插入/删除以及最大堆的排序
先说一下最大堆如何排序:转自:http://www.cnblogs.com/luchen927/archive/2012/03/08/2381446.html 最大堆和最小堆在算法中也有运用.比如用最 ...
- Huffman Tree哈夫曼树的最小堆实现
带权路径长度WPL:从根结点到各个叶子结点的路径长度和相应叶子结点权值的乘积之和 哈夫曼树:带权路径长度最小的二叉树(最优二叉树) -没有度为1的结点,有n个叶子结点的哈夫曼树共有2n-1个结点 -任 ...
- 数据结构之堆的插入、取值、排序(细致讲解+图片演示)
数据结构之堆(Heap):插入.取值.排序. 堆是一种数据结构,分为最小堆和最大堆,可以用二叉树来表示. 在二叉树的任意的一个三角结构中(一个父节点,两个子节点),需要满足以下两个条件: 1.父节点要 ...
- 使用最小堆使用优先级队列(c语言版本)
下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...
- 优先级队列 c语言,使用最小堆使用优先级队列(c语言版本)
下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...
- 使用最小堆优化Dijkstra算法
OJ5.2很简单,使用priority_queue实现了最小堆竟然都过了OJ--每次遇到relax的问题时都简单粗暴地重新push进一个节点-- 然而正确的实现应该是下面这样的吧,关键在于swap堆中 ...
最新文章
- The XOR Largest Pair(01trie模板题)
- 全球最权威的区块链行业报告
- 10601 - Cubes(Ploya)
- oracle层次查询中prior与自上而下、自下而上查询
- 整理了一下linux/ubuntu里面卸载软件的方法
- java store()_Java.util.Properties.store()
- l28n和开发版_Atmel之SAM4S Xplained开发板评测(二)
- 分布式链路追踪 之 Skywalking 设计理念核心原理
- AI 算法起家的今日头条为何败给了色情?
- spring3的JAR包与注解学习笔记
- cowpatty无线破解之——WPA-PSK字典攻击
- 字节图标iconpark在vue3中的使用
- 数字图像算术编码python_算术编码简介
- layabox学习(一)·helloworld以及自定义路径
- js根据年份计算总周数并获取每周的日期范围
- oracle怎么看alter日志,Oracle 11g 日志alter文件位置
- python热力图参数_python3.5数据处理——百度地图热力图传值
- traceroute不通的解决
- excel自动化的第一个实用例子(宿舍分饭)
- 为什么我可以正常上网,却ping不通自己的外网IP呢???