大小堆C++实现
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++实现的更多相关文章
- [剑指offer] 41. 数据流中的中位数 (大小堆,优先队列)
对于海量数据与数据流,用最大堆,最小堆来管理. class Solution { public: /* * 1.定义一个规则:保证左边(大顶堆)和右边(小顶堆)个数相差不大于1,且大顶堆的数值都小于等 ...
- Java实现 LeetCode 786 第 K 个最小的素数分数(大小堆)
786. 第 K 个最小的素数分数 一个已排序好的表 A,其包含 1 和其他一些素数. 当列表中的每一个 p<q 时,我们可以构造一个分数 p/q . 那么第 k 个最小的分数是多少呢? 以整数 ...
- Java实现 LeetCode 630 课程表 III(大小堆)
630. 课程表 III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d 天时要完成 ...
- Java生产环境JVM设置成固定堆大小深层原理
可能很多人都知道Java程序上生产后,运维人员都会设定好JVM的堆大小,而且还是把最大最小设置成一样的值.那究竟是为什么呢?一般而言,Java程序如果你不显示设定该值得话,会自动进行初始化设定. -X ...
- Java堆内存
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Yo ...
- 关于栈和堆的定量分析(★firecat推荐★)
文章来源:http://blog.csdn.net/bigbug_zju/article/details/39525281 计算机系统中的堆和栈是跟程序员最密切的两个概念.如果没有栈和堆的概念,下面程 ...
- windows 堆管理
windows堆管理是建立在虚拟内存管理的基础之上的,每个进程都有独立的4GB的虚拟地址空间,其中有2GB的属于用户区,保存的是用户程序的数据和代码,而系统在装载程序时会将这部分内存划分为4个段从低地 ...
- 堆溢出学习笔记(linux)
本文主要是linux下堆的数据结构及堆调试.堆溢出利用的一些基础知识 首先,linux下堆的数据结构如下 /* This struct declaration is misleading (but a ...
- 浅谈Java堆内存分代回收
目录 1.概述 2.堆内存是如何分代的 3.各分代之间是如何配合工作的 1.概述 与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我 ...
随机推荐
- MapReduce Unit Test
以前用java写MR程序总不习惯写单元测试,就是查错也只是在小规模数据上跑一下程序.昨天工作时,遇到一个bug,查了好久也查出来.估计是业务逻辑上的错误.后来没办法,只好写了个单元测试,一步步跟踪,瞬 ...
- Java基础知识陷阱(二)
本文发表于本人博客. 上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参.先看下面代码: public void changeInt(int a){ a = ; } ...
- 记一次服务器迁移 TFS客户端ip更换
服务器迁移,TFS服务端IP由原10.58.8.231更换至10.58.1.230 TFS客户端更换ip操作比较复杂,请谨慎操作,避免脱库的风险!!! 打开注册表,运行->regedit 找到H ...
- 跨域问题-cors
什么是跨域如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求.比如,使用 XMLHttpRequest 对象发起 HTTP 请求就必须遵守同源策略(same-origin policy). 具 ...
- pc端弹框
pc弹框插件:http://aui.github.io/artDialog/doc/index.html#quickref-bubble PC端,手机端,layui很好用,分页啥的:http://ww ...
- 什么是HotSpot VM
学习并转载自https://www.cnblogs.com/charlesblc/p/5993804.html 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJD ...
- hive报错汇总
1.需要注意的是,要在namenode(超级用户)上操作,貌似是 hive> insert into table record_partition partition(trancation_da ...
- linux系统中python版本升级
一,查看python版本号 python -V 二,下载需要升级到python版本包下载地址https://www.python.org/ftp/python/ 根据需要选择需要的python版本 e ...
- PentestBox简明使用教程
介绍 PentestBox:渗透测试盒子 顾名思义,这是一个渗透工具包,但是不同于绝大多数国内xx工具包的是,这里集成的大都是Linux下的工具,Kali Linux上面的常用的很多工具这里面也都集成 ...
- 页面渲染是否结束 与 jquery插件方法是否可以应用
只有页面全部 渲染结束,才可以调用 插件的方法. 正确写法: $(function(){ 插件调用方法. })