实现堆结构

总时间限制: 
3000ms

内存限制: 
65535kB
描述

定义一个数组,初始化为空。在数组上执行两种操作:

1、增添1个元素,把1个新的元素放入数组。

2、输出并删除数组中最小的数。

使用堆结构实现上述功能的高效算法。

输入
第一行输入一个整数t,代表测试数据的组数。
对于每组测试数据,第一行输入一个整数n,代表操作的次数。
每次操作首先输入一个整数type。
当type=1,增添操作,接着输入一个整数u,代表要插入的元素。
当type=2,输出删除操作,输出并删除数组中最小的元素。
1<=n<=100000。
输出
每次删除操作输出被删除的数字。

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 #define maxn 100005
 5
 6 long sz, heap[maxn];
 7
 8
 9 void Insert(int x)
10 {
11     int i = sz++;
12     while (i > 0) {
13         int p = (i - 1) >> 1;
14         if (heap[p] > x) {
15             heap[i] = heap[p];
16             i = p;
17         }
18         else break;
19     }
20     heap[i] = x;
21 }
22
23 void GetTop()
24 {
25     long ans = heap[0];
26     printf("%ld\n", ans);
27     long x = heap[--sz];
28     long i = 0;
29     while ((i << 1) + 1 < sz) {
30         long left = (i << 1) + 1;
31         long right = (i << 1) + 2;
32         if (right < sz && heap[right] < heap[left])
33             left = right;
34         if (heap[left] >= x)break;
35         heap[i] = heap[left];
36         i = left;
37     }
38     heap[i] = x;
39 }
40
41 int main()
42 {
43     int t, n;
44     cin >> t;
45     while (t--) {
46         sz = 0;
47         memset(heap, 0, sizeof(heap));
48         cin >> n;
49         while (n--) {
50             int type;
51             long u;
52             cin >> type;
53             if (type == 1) {
54                 cin >> u;
55                 Insert(u);
56             }
57             else if (type == 2)
58                 GetTop();
59         }
60     }
61     //system("pause");
62     return 0;
63 }

原文地址:https://www.cnblogs.com/Jeffrey-Y/p/10162270.html

时间: 2024-10-11 09:43:36

实现堆结构的相关文章

探秘堆结构

一.概述 此处所说的堆为数据结构中的堆,而非内存分区中的堆.堆通常可以被看做是树结构,满足两个性质:1)堆中任意节点的值总是不大于(不小于)其子节点的值:2)堆是一棵完全树.正是由于这样的性质,堆又被称为优先队列.根据性质一,将任意节点不大于其子节点的堆称为最小堆或最小优先队列,反之称为最大堆或最大优先队列.优先队列在操作系统作业调度的设计中有着举足轻重的作用.之前写了一篇优先队列的文章,详见算法导论第六章优先队列. 常见的堆结构,有二叉堆.左倾堆.斜堆.二项堆.斐波那契堆等.斐波那契堆在前文算

树-堆结构练习——合并果子之哈夫曼树

树-堆结构练习——合并果子之哈夫曼树 Time Limit: 1000MS Memory limit: 65536K 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节

SDUT 堆结构练习——合并果子之哈夫曼树(丧心病狂heap)

树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和. 因为还要花大力气把这些果子搬回家,所以

重量平衡树之Treap:以随机优先级来维护堆结构,并满足BST性质

关于重量平衡树的相关概念可以参考姊妹文章:重量平衡树之替罪羊树 Treap是依靠旋转来维护平衡的重量平衡树中最为好写的一中,因为它的旋转不是LL就是RR 对于每一个新的节点,它给这个节点分配了一个随机数,用作优先级,然后以这个优先级来维护一个堆结构 由于堆本身就是完全二叉树结构,这样维护之后的树就无限接近于完全二叉树,所以还是很神奇的 这棵树满足BST的一切性质,除了不能处理序列问题之外已经无敌了 应该说,抛去动态树问题之外,这是实战最好用的树了 我们还是先看定义: struct Tree {

八大基本排序---堆排序、堆结构

堆排序很重要,但是更重要的是堆这个结构 堆结构:实际上是一棵完全二叉树 一个数组可以根据父结点.左子结点.右子结点的关系,脑补出一棵完全二叉树 算法1:一个数组变为大顶堆 heapInsert() 数组:2.1.3.6.0.4 (1)只有2的时候 (2) 2.1[认为完全二叉树的范围是0~1的,超过1就越界] (3)2.1.3 3(下标2)找到自己的父结点:(2-1)/2=0 此时不满足大顶堆了,将2跟3交换 (4)2.1.3.6 6(下标3)找到它的父结点:(3-1)/2=1,发现6>1,将3

《Thinking in Algorithm》16.堆结构之斐波那契堆

堆的变体: 二叉堆 二项堆 斐波那契堆 前面的博客中我们讲到的堆的两种变体,二叉堆和二项堆,今天我们要讲的就是著名的斐波那契堆. 依然首先列出了三种堆的时间复杂的比较. 从上面能发现斐波那契堆的时间复杂度在很多操作上有优化,如insert, minimum, union , decrease-key,而extreact-min,delete没有变化. 可能看到这很多人会说为什么有这么好的斐波那契堆,我们还要去研究其他堆呢,确实,理论上来讲,对于extreact-min和delete操作想对于其他

几种堆结构比较

对于堆大家都不陌生,无非就是最大堆和最小堆之分,堆的使用很广泛,优先队列.求大叔组的前k个数都可以用堆实现,且时间复杂度低.但是对于堆的具体实现存在几种不同的方式,它们各有优势. 根据堆底层的实现可分为顺序存储堆和链式存储堆,链式存储又分为左式堆.斜堆以及二项堆. 1.顺序存储堆就是我们经常接触的堆,即使用数组实现,逻辑上相当于完全二叉树.它的实现以及堆排序大家已经很熟悉了,这里不再赘述,顺序堆的缺点是合并两个堆的时间复杂度比较高,通常从一个堆中逐次取出元素插入到另一个堆中,时间复杂度为O(Nl

关于堆结构的详解

一.定义 堆的定义 堆其实就是一棵完全二叉树(若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边), 定义为:具有n个元素的序列(h1,h2,...hn),当且仅当满足(hi>=h2i,hi>=h2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)时称之为堆 大顶堆 堆顶元素(即第一个元素)为最大项,并且(hi>=h2i,hi>=h2i+1) 小顶堆 堆顶元素为最小项

SDUTOJ 2127 树-堆结构练习——合并果子之哈夫曼树

#include<iostream> #include<stdlib.h> #define N 30000 using namespace std; int a[N+1],o=0; typedef struct { int weight; int parent,lchild,rchild; }htnode; typedef struct { int weight; }htcode; void huffmanselect(htnode ht[],int k,int *s1,int *