C++大小堆实现(仿函数)

具体代码如下

#pragma once
#include<iostream>
#include<vector> using namespace std; template<class T>
class Big
{
public:
bool operator()(T x, T y)
{
return x > y;
}
};
template<class T=int>
class Sma
{
public:
bool operator()(T x, T y)
{
return x < y;
}
}; template<class T,class Cmp>
class Heap
{
public:
Heap()
{}
Heap(const T* arr, size_t size)
{
for (int i = ; i < size; ++i)
{
_heap.push_back(arr[i]);
}
int root = (_heap.size() - ) / ;//找到第一个非叶子结点
while (root>=)
//向下调整
AdjustDown(root--);
} void Push(T & t)
{
_heap.push_back(t);
AdjustUp(_heap.size() - );
}
void pop()
{
if (_heap.size() == )
return;
if (_heap.size() <= )
{
swap(_heap[], _heap[_heap.size() - ]);
_heap.pop_back();
}
else
{
swap(_heap[], _heap[_heap.size() - ]);
_heap.pop_back();
AdjustDown();
}
}
bool IsEmpty()const
{
return _heap.size() == ;
}
const T & top() const
{
if (_heap.size() != )
return _heap[];
else
throw exception("this is a bug");
}
protected:
void AdjustDown(int root)
{
//int child = root * 2 + 2 >= _heap.size() ? root * 2 + 1 : Cmp(_heap[root * 2 + 1], _heap[root * 2 + 2]) ? root * 2 + 1 : root * 2 + 2;
while (root <= (_heap.size() - ) / )
{
int child = root * + >= _heap.size() ? root * + : Cmp()(_heap[root * + ], _heap[root * + ]) ? root * + : root * + ;
if (!Cmp()(_heap[root], _heap[child]))
{
swap(_heap[root], _heap[child]);
}
else
{
break;
}
root = child;
}
} void AdjustUp(int child)
{
while (child >= )
{
int root = (child - ) / ;
if (!Cmp()(_heap[root], _heap[child]))
{
swap(_heap[root], _heap[child]);
}
child = root;
}
}
protected:
vector<T> _heap;
}; void test_heap()
{
int arr[] = { , , , , , , , , , };
Heap<int, Sma<int> >hp1(arr, );
int b = ;
hp1.Push(b);
cout << "Over!" << endl;
while (!hp1.IsEmpty())
{
cout << hp1.top() << " ";
hp1.pop();
}
system("pause");
}

大小堆C++实现的更多相关文章

  1. [剑指offer] 41. 数据流中的中位数 (大小堆,优先队列)

    对于海量数据与数据流,用最大堆,最小堆来管理. class Solution { public: /* * 1.定义一个规则:保证左边(大顶堆)和右边(小顶堆)个数相差不大于1,且大顶堆的数值都小于等 ...

  2. Java实现 LeetCode 786 第 K 个最小的素数分数(大小堆)

    786. 第 K 个最小的素数分数 一个已排序好的表 A,其包含 1 和其他一些素数. 当列表中的每一个 p<q 时,我们可以构造一个分数 p/q . 那么第 k 个最小的分数是多少呢? 以整数 ...

  3. Java实现 LeetCode 630 课程表 III(大小堆)

    630. 课程表 III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d 天时要完成 ...

  4. Java生产环境JVM设置成固定堆大小深层原理

    可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值.那究竟是为什么呢?一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定. -X ...

  5. Java堆内存

    Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Yo ...

  6. 关于栈和堆的定量分析(★firecat推荐★)

    文章来源:http://blog.csdn.net/bigbug_zju/article/details/39525281 计算机系统中的堆和栈是跟程序员最密切的两个概念.如果没有栈和堆的概念,下面程 ...

  7. windows 堆管理

    windows堆管理是建立在虚拟内存管理的基础之上的,每个进程都有独立的4GB的虚拟地址空间,其中有2GB的属于用户区,保存的是用户程序的数据和代码,而系统在装载程序时会将这部分内存划分为4个段从低地 ...

  8. 堆溢出学习笔记(linux)

    本文主要是linux下堆的数据结构及堆调试.堆溢出利用的一些基础知识 首先,linux下堆的数据结构如下 /* This struct declaration is misleading (but a ...

  9. 浅谈Java堆内存分代回收

    目录 1.概述 2.堆内存是如何分代的 3.各分代之间是如何配合工作的 1.概述 与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我 ...

随机推荐

  1. 工作中发现Web服务器的磁盘满后故障分析

    遇到的问题:   今天收到报警,某台线上的服务器的磁盘已满,但是登上去使用du -sh /log/* 检查, 发现文件的大小远远小于磁盘的空间,此时不知道该如何解决! 解决的方法:   其实,如果只是 ...

  2. Java 语言中 Enum 类型的使用介绍【转载】

    简介:本文主要介绍了 Java 语言中枚举类型,以及如何定制 Enum 类型的定义,如何正确使用 Enum 类型. From:http://www.ibm.com/developerworks/cn/ ...

  3. property函数的使用

    描述 property函数的作用是在新式类中返回属性值 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改 s=Student() s.score= ...

  4. 《mysql必知必会》读书笔记--游标的使用

    游标的使用 MySQL中游标只能用于存储过程 创建游标 CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR S ...

  5. 2017 Multi-University Training Contest - Team 4 hdu6071 Lazy Running

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6071 题目: Lazy Running Time Limit: 2000/1000 MS (J ...

  6. Spring-1-I 233 Matrix(HDU 5015)解题报告及测试数据

    233 Matrix Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Descript ...

  7. MongoDB使用中的一些问题

    1.count统计结果错误 这是由于分布式集群正在迁移数据,它导致count结果值错误,需要使用aggregate pipeline来得到正确统计结果,例如: db.collection.aggreg ...

  8. php AES-128-CBC 加密 通信java

    <?phpheader("Content-type: text/html; charset=utf-8");require('MyAES.php');class Xfb{ / ...

  9. CentOS 6.3编译安装LAMP环境笔记

    转载地址:http://www.jb51.net/article/54969.htm 最近抽空在虚拟机上测试成功了LAMP各个最新版本的整合编译安装,算是把之前的博文整合精简,以下内容均在CENTOS ...

  10. 实现类似mysql group_concat的功能

    实现类似mysql group_concat的功能 SELECT SG.Id ,SG.GroupName ,HostNames = STUFF((SELECT ',' + SH.[HostName] ...