:就是一个特殊的二叉树,每个节点的值都大于(小于)其子节点值的完全二叉树。堆节点的子节点也满足其要求。堆的结点必须大于2。

大顶堆与小顶堆
双亲结点的值总是大于子节点的值,为大顶堆。(上图就是一个大顶堆)
双亲节点的值总是小于子节点的值,则为小顶堆。

堆的插入

  • 以大顶堆为例,插入操作:

    例如上图,插入结点5,由于7的值比5大所以该堆不需要调整。

    当插入元素为9时,由于数值9比7大所以上面的堆需要调整。

    当9结点在该位置时,满足大顶堆的要求,则不需要继续调整。
void Insert(T value) //value表示待插值,size表示已插的数量,capacity表示数组大小{if (size < capacity)  //当前已插入的数量小于数组大小{heap[size++] = value;   //将插入值,放到数组的有效元素最后一个位置int index = size;  while (index>1){if (heap[index] > heap[index / 2]) //比较双亲结点的值与子节点的值swap(heap[index], heap[index / 2]);    //如果双亲结点的值大于子节点,则交换index /= 2;      //向上不断调整}}else          //数组已满,退出return;
  • 删除操作

    例如删除结点14,则在堆中找出最小的值,与其替换,由于上述图中,最小的值为7,则将7替换到14的位置。

    最终只需要将14删除即可。
void DeleteMax(){if (size == 0)return;swap[heap[1], heap[size--]];  //用最后一个结点将第一个结点替换,//替换结束后最后一个结点为原本第一个结点//size--表示删除最后一个结点,int index = 1;                    //也就是将第一个节点间接删除while (index <= size){int p = 2 * index;if (p < size && heap[p] < heap[p + 1]) //找孩子节点中最大的一个p++;swap(heap[p], heap[index]);index = p;    //继续向下调整}}

完整代码:

#include<iostream>
#include<vector>using namespace std;template<class T>
class MaxHeap
{
public:MaxHeap(int _capacity = 10){size = 0;capacity = _capacity;heap = new T[capacity];}~MaxHeap(){delete[] heap;}bool empty(){if (size == 0)return true;return false;}void Insert(T value){if (size < capacity){heap[size++] = value;int index = size;while (index>1){if (heap[index] > heap[index / 2])swap(heap[index], heap[index / 2]);index /= 2;}}elsereturn;}void DeleteMax(){if (size == 0)return;swap[heap[1], heap[size--]];  //用最后一个结点将第一个结点替换,替换结束后最后一个结点为原本第一个结点,size--表示删除最后一个结点,int index = 1;               //也就是将第一个节点间接删除while (index <= size){int p = 2 * index;if (p < size && heap[p] < heap[p + 1]) //找孩子节点中最大的一个p++;swap(heap[p], heap[index]);index = p;    //继续向下调整}}T Maxvalue(){if (empty())return -1;return heap[1];}
private:int size;int capacity;T* heap;
};void BuildHeap(int res[], int size)  //用数组创建堆
{for (int i = size / 2; i >= 1; --i){int temp = res[i];int index = 2 * i;while (index <= size){if (index < size &&res[index] < res[index + 1])index++;if (res[index] > temp){res[index / 2] = res[index];index *= 2;}elsebreak;}res[index / 2] = temp;}
}template<class T>
void TestMaxHeap()
{int res[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };BuildHeap(res, 9);for (int i = 1; i < 10; ++i){cout << res[i] << " ";}
}
int main()
{TestMaxHeap<int>();system("pause");return 0;
}

C++---堆代码实现相关推荐

  1. 从那堆代码中,你懂得了哪些道理?

    作为一名正在刷各种oj,备战比赛的大二学生.我忽然发现在那些算法中,总能发现那些充满人生哲理性的道理. 举个例子吧,比如欧拉筛法,动态规划.比如朴素素数打表和欧拉筛法对比的一样.也许你刚开始会比别人付 ...

  2. 用VC写Assembly代码(6)--附录1[堆和栈的区别]

    堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...

  3. [bzoj2333] [SCOI2011]棘手的操作 (可并堆)

    //以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec  Memory Limit: 128 MB Description 有N个节点,标号从1 ...

  4. 经验总结 | 重构让你的代码更优美和简洁

    1. 前言 最近,笔者有幸对高德打车订单Push项目进行了重构,与大家分享一下代码重构相关的工作经验,希望对大家有所启发. 有时候,我们在做某个功能需求时,需要花掉大量的时间,才能找到和需求有关联的代 ...

  5. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法

    内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...

  6. 堆和栈的区别 (转贴)

    非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动 ...

  7. 为什么 if else 不是好代码?

    平时开发中if-else用的多吗? 其实这是个再正常不过的coding习惯,当我们代码量小的时候用来做条件判断是再简单不过的了. 但对于优秀程序员来说,这并不是好代码, 为啥? 抛开剂量谈毒性都是耍流 ...

  8. C++堆 和 栈 空间的区别

    http://www.cppblog.com/oosky/archive/2006/01/21/2958.html 堆和栈的区别 (转贴) 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥 ...

  9. 数据结构与算法 | 堆

    二叉树的顺序结构 堆的概念及结构 堆的实现 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费.而完全二叉树更适合使用顺序结构存储.现实中我们通常把堆(一种二叉树)使用 ...

最新文章

  1. SparkR对R的支持情况
  2. Spring Cloud构建微服务架构:分布式服务跟踪(收集原理)【Dalston版】
  3. java linux download
  4. Android之推荐看的Android源码
  5. verilog将像素数据写入txt_FPGA仿真必备(1)——Matlab生成.mif文件/.txt文件
  6. html编辑plist文件,Swift开发:Info.plist文件的常见配置
  7. Python手动安装Jieba库(Win11)
  8. FAT32文件操作系统
  9. Android google中文开发网站
  10. 01背包问题解法及优化
  11. 品牌数字化转型|借势营销节点,3 招解锁品牌营销力
  12. elasticsearch 数据类型
  13. Silverstack Lab for Mac(媒体资源数据管理工具)激活版
  14. 3. Python控制结构
  15. pandas多场景业务实战-指标计算
  16. DSPE-PEG-SP2-AA,二硬脂酰基磷脂酰乙醇胺-聚乙二醇-SP2-AA,具有较好的生物相容性和被动靶向性,可应用于药物输送系统
  17. Unity帧同步和状态同步
  18. 数加服装样衣进度管理
  19. 【C语言之入门规划】料峭春风吹酒醒,C语言学习规划与展望。
  20. 概要设计说明书-模板(referrence)

热门文章

  1. 从零开始学TensorFlow 1
  2. UVa 1592 数据库
  3. 多线程-Threading
  4. 036、JVM实战总结:糟糕!运行着的线上系统突然卡死无法访问,万恶的JVM GC!
  5. python替换文件内容_使用python替换文件内容
  6. Notepad++相关插件
  7. ARM处理器指定运行核
  8. 计算机系统-理论-内存读取/大端法小端法
  9. Java-Volatile的实现(待删除)
  10. 计算机网络自顶向下-运输层