堆数据结构是一种数组对象,它可以被视为一颗完全二叉树结构(或者也有可能是满二叉树)

最大堆:

任一结点的关键码均大于等于它的左右孩子的关键码,其中堆顶的元素最大。(任一路径中的元素升序排列)

最小堆:

任一结点的关键码均小于等于它的左右孩子的关键码,其中堆顶的元素最小。(任一路径中的元素升序排列)

已知父节点:

左孩子节点 = 2*父节点+1
右孩子节点 = 2*父节点+2

已知孩子节点:

父节点 = (孩子节点-1)/ 2

堆的应用


  1. 优先级队列
  2. 堆排序
  3. 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++实现最大堆和最小堆相关推荐

  1. C++判断一个序列是否为堆(最大堆、最小堆)

    参考:https://blog.csdn.net/guoweimelon/article/details/50904346 1.如何判断一个序列是不是堆? 把这个序列看成是数组型的二叉树,如果根节点是 ...

  2. 最大堆和最小堆和平衡二叉树_最小堆二叉树

    最大堆和最小堆和平衡二叉树 A Min Heap Binary Tree is a Binary Tree where the root node has the minimum key in the ...

  3. 最大堆和最小堆(数据结构)

    堆和栈的区别: 一.空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等.其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序 ...

  4. 2020 C++ priority_queue 最大堆与最小堆介绍

    文章目录 1.问题描述 2.具体分析 3.其他方式 4.用最小堆解决问题 1.问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何 ...

  5. 堆(一)最大堆和最小堆的实现

    最大堆和最小堆的实现 这一讲讲的还是堆,因此将它归入到堆(一)中.这一篇博客的目的非常简单,就是补充一下堆的实现代码.Heap是抽象类,它有两个子类,MaxHeap和MinHeap.回顾一下堆的性质: ...

  6. 最大堆和最小堆基本概念(以及栈和堆的区别)

    堆和栈的区别: 一.堆栈空间分配区别: 1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈: 2.堆(操作系统): 一般由程序员分配释放, ...

  7. 数据结构——最大堆和最小堆(C语言)

    定义: 最大堆和最小堆都是一棵完全二叉树. 最大堆:是指根节点的关键字值是堆中的最大关键字值,且每个节点若有儿子节点,其关键字值都不小于其儿子节点的关键字值. 最小堆:是指根节点的关键字值是堆中的最小 ...

  8. 使用最大堆和最小堆实现中位数的查找

    参考链接:双堆维护数组中位数 用堆维护中位数的意思是说,设计两个堆,第一个堆(大顶堆)存放小于中位数的元素,第二个堆(小顶堆)存放大于中位数的元素. 下面是双堆维护中位数的语言描述: 1.初始化的时候 ...

  9. 最大堆、最小堆的建立、插入和删除操作

    堆数的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值: (3)堆树中每个节点的子树都是堆树. 当父节点的键值总是大于或等于任何一个子节点 ...

最新文章

  1. python更改list数据类型_python3笔记十一:python数据类型-List列表
  2. 如何选择适合自己公司的移动办公系统?
  3. 使用ISA实现用户级验证(1~3篇)
  4. Android入门之常用控件
  5. Leecode07. 整数反转——Leecode大厂热题100道系列
  6. 美国计算机研究生学校排名2015,2015USNews美国大学研究生计算机工程专业排名
  7. python移植到arm_python移植到arm平台
  8. java 网页应用 原理_【转载】Web应用工作原理
  9. 未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试...
  10. foreach 用法例子
  11. 在 Less 中写 IE 的css hack
  12. Linux之centos包管理rpm、yum、tar
  13. NXP数学电机库PI控制器参数的理解
  14. Win server 2008 R2激活工具使用图文教程(SK Patch v1 R2 Final OEM)
  15. AlphaControls TsSkinManager 控件
  16. 基于云虚拟机的代码覆盖率
  17. python爬虫之爬取捞月狗直播信息
  18. linux系统漏洞补丁包,RedHat 5.X、6.X Bash漏洞RPM补丁包下载
  19. 智慧水务信息化管理平台解决方案
  20. 华为网络技术工程师-2019届杭州优招面试经历总结

热门文章

  1. 【软考系统架构设计师】2012年下系统架构师综合知识历年真题
  2. 什么是 event.currentTarget?
  3. 1223 -- 德玛西亚正义
  4. 开源外卖平台(Web, 微信, APP)
  5. 推荐5款免费且无广告的软件,助你提升效率
  6. 私域流量的引流方式有哪些
  7. Eclipse收藏品的隐藏宝藏
  8. python 02随笔
  9. 微信小程序:rich-text 富文本中图片自适应
  10. lisp 焊接符号标注_焊接符号标注大全word详解