C++实现最大堆和最小堆
堆
堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构(或者也有可能是满二叉树)
最大堆:
任一结点的关键码均大于等于它的左右孩子的关键码,其中堆顶的元素最大。(任一路径中的元素升序排列)
最小堆:
任一结点的关键码均小于等于它的左右孩子的关键码,其中堆顶的元素最小。(任一路径中的元素升序排列)
已知父节点:
左孩子节点 = 2*父节点+1
右孩子节点 = 2*父节点+2
已知孩子节点:
父节点 = (孩子节点-1)/ 2
堆的应用
- 优先级队列
- 堆排序
- 100W个数中找出最大(最小)的前K个数
最大堆和最小堆的实现
Heap.h
#pragma once
#include<iostream>
#include<assert.h>
#include<vector>
using namespace std;template<class T>
struct Less
{bool operator()(const T& left, const T& right) const{return left < right;}
};template<class T>
struct Greater
{bool operator()(const T& left, const T& right) const{return left > right;}
};template<class T, class Compare=Less<T>>
class Heap
{
public:Heap()//无参的构造函数(系统不会给无参构造函数),开始堆是空的不需要做什么事{}Heap(T* a, size_t n){_a.reserve(n);//开空间for (size_t i = 0; i < n; ++i){_a.push_back(a[i]);}//建堆,找最后一个非叶子节点for (int i = (_a.size() - 2) / 2; i >= 0; --i)//不用size_t,因为i在这可能等于0,用size_t会死循环{AdjustDown(i);}}//向下调整void AdjustDown(int root){Compare com;int parent = root;size_t child = parent * 2 + 1;//默认为左孩子while (child < _a.size()){//选出小孩子//if (child+1 > _a.size() && _a[child + 1]< _a[child])if (child + 1 < _a.size() && com(_a[child + 1], _a[child])){++child;}//if (_a[child] < _a[parent])if (com(_a[child], _a[parent])){swap(_a[child], _a[parent]);//交换值parent = child;child = parent * 2 + 1;}else{break;}}}//向上调整void AdjustUp(int child){Compare com;int parent = (child - 1) / 2;while (parent >= 0){//if (_a[child] < _a[parent])if (com(_a[child], _a[parent])){swap(_a[parent], _a[child]);child = parent;parent = (child - 1) / 2;}else{break;}}}//最后插入void Push(const T&x){_a.push_back(x);AdjustUp(_a.size() - 1);}//删除最大数void Pop(){assert(!_a.empty());swap(_a[0], _a[_a.size() - 1]);_a.pop_back();AdjustDown(0);}//取顶元素T& Top(){assert(!_a.empty());return _a[0];}size_t Size(){return _a.size();}bool Empty(){return _a.empty();}private:vector<T> _a;};
test.cpp
#include <iostream>
#include "Heap.h"
using namespace std;int main()
{int a[] = {10,11,13,12,16,18,15,17,14,19};// Heap<int,Greater<int>> hp1(a,sizeof(a)/sizeof(a[0])); 最大堆// Heap<int,Less<int>> hp1(a,sizeof(a)/sizeof(a[0])); 最小堆Heap<int> hp1(a,sizeof(a)/sizeof(a[0])); // 缺省,最小堆hp1.Push(15);return 0;
}
运行结果:
测试最大堆:
测试最小堆:
C++实现最大堆和最小堆相关推荐
- C++判断一个序列是否为堆(最大堆、最小堆)
参考:https://blog.csdn.net/guoweimelon/article/details/50904346 1.如何判断一个序列是不是堆? 把这个序列看成是数组型的二叉树,如果根节点是 ...
- 最大堆和最小堆和平衡二叉树_最小堆二叉树
最大堆和最小堆和平衡二叉树 A Min Heap Binary Tree is a Binary Tree where the root node has the minimum key in the ...
- 最大堆和最小堆(数据结构)
堆和栈的区别: 一.空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等.其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序 ...
- 2020 C++ priority_queue 最大堆与最小堆介绍
文章目录 1.问题描述 2.具体分析 3.其他方式 4.用最小堆解决问题 1.问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何 ...
- 堆(一)最大堆和最小堆的实现
最大堆和最小堆的实现 这一讲讲的还是堆,因此将它归入到堆(一)中.这一篇博客的目的非常简单,就是补充一下堆的实现代码.Heap是抽象类,它有两个子类,MaxHeap和MinHeap.回顾一下堆的性质: ...
- 最大堆和最小堆基本概念(以及栈和堆的区别)
堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...
- 数据结构——最大堆和最小堆(C语言)
定义: 最大堆和最小堆都是一棵完全二叉树. 最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值. 最小堆:是指根节点的关键字值是堆中的最小 ...
- 使用最大堆和最小堆实现中位数的查找
参考链接:双堆维护数组中位数 用堆维护中位数的意思是说,设计两个堆,第一个堆(大顶堆)存放小于中位数的元素,第二个堆(小顶堆)存放大于中位数的元素. 下面是双堆维护中位数的语言描述: 1.初始化的时候 ...
- 最大堆、最小堆的建立、插入和删除操作
堆数的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值: (3)堆树中每个节点的子树都是堆树. 当父节点的键值总是大于或等于任何一个子节点 ...
最新文章
- python更改list数据类型_python3笔记十一:python数据类型-List列表
- 如何选择适合自己公司的移动办公系统?
- 使用ISA实现用户级验证(1~3篇)
- Android入门之常用控件
- Leecode07. 整数反转——Leecode大厂热题100道系列
- 美国计算机研究生学校排名2015,2015USNews美国大学研究生计算机工程专业排名
- python移植到arm_python移植到arm平台
- java 网页应用 原理_【转载】Web应用工作原理
- 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试...
- foreach 用法例子
- 在 Less 中写 IE 的css hack
- Linux之centos包管理rpm、yum、tar
- NXP数学电机库PI控制器参数的理解
- Win server 2008 R2激活工具使用图文教程(SK Patch v1 R2 Final OEM)
- AlphaControls TsSkinManager 控件
- 基于云虚拟机的代码覆盖率
- python爬虫之爬取捞月狗直播信息
- linux系统漏洞补丁包,RedHat 5.X、6.X Bash漏洞RPM补丁包下载
- 智慧水务信息化管理平台解决方案
- 华为网络技术工程师-2019届杭州优招面试经历总结