C++---堆代码实现
堆:就是一个特殊的二叉树,每个节点的值都大于(小于)其子节点值的完全二叉树。堆节点的子节点也满足其要求。堆的结点必须大于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++---堆代码实现相关推荐
- 从那堆代码中,你懂得了哪些道理?
作为一名正在刷各种oj,备战比赛的大二学生.我忽然发现在那些算法中,总能发现那些充满人生哲理性的道理. 举个例子吧,比如欧拉筛法,动态规划.比如朴素素数打表和欧拉筛法对比的一样.也许你刚开始会比别人付 ...
- 用VC写Assembly代码(6)--附录1[堆和栈的区别]
堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...
- [bzoj2333] [SCOI2011]棘手的操作 (可并堆)
//以后为了凑字数还是把题面搬上来吧2333 发布时间果然各种应景... Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个节点,标号从1 ...
- 经验总结 | 重构让你的代码更优美和简洁
1. 前言 最近,笔者有幸对高德打车订单Push项目进行了重构,与大家分享一下代码重构相关的工作经验,希望对大家有所启发. 有时候,我们在做某个功能需求时,需要花掉大量的时间,才能找到和需求有关联的代 ...
- 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法
内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...
- 堆和栈的区别 (转贴)
非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动 ...
- 为什么 if else 不是好代码?
平时开发中if-else用的多吗? 其实这是个再正常不过的coding习惯,当我们代码量小的时候用来做条件判断是再简单不过的了. 但对于优秀程序员来说,这并不是好代码, 为啥? 抛开剂量谈毒性都是耍流 ...
- C++堆 和 栈 空间的区别
http://www.cppblog.com/oosky/archive/2006/01/21/2958.html 堆和栈的区别 (转贴) 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥 ...
- 数据结构与算法 | 堆
二叉树的顺序结构 堆的概念及结构 堆的实现 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费.而完全二叉树更适合使用顺序结构存储.现实中我们通常把堆(一种二叉树)使用 ...
最新文章
- SparkR对R的支持情况
- Spring Cloud构建微服务架构:分布式服务跟踪(收集原理)【Dalston版】
- java linux download
- Android之推荐看的Android源码
- verilog将像素数据写入txt_FPGA仿真必备(1)——Matlab生成.mif文件/.txt文件
- html编辑plist文件,Swift开发:Info.plist文件的常见配置
- Python手动安装Jieba库(Win11)
- FAT32文件操作系统
- Android google中文开发网站
- 01背包问题解法及优化
- 品牌数字化转型|借势营销节点,3 招解锁品牌营销力
- elasticsearch 数据类型
- Silverstack Lab for Mac(媒体资源数据管理工具)激活版
- 3. Python控制结构
- pandas多场景业务实战-指标计算
- DSPE-PEG-SP2-AA,二硬脂酰基磷脂酰乙醇胺-聚乙二醇-SP2-AA,具有较好的生物相容性和被动靶向性,可应用于药物输送系统
- Unity帧同步和状态同步
- 数加服装样衣进度管理
- 【C语言之入门规划】料峭春风吹酒醒,C语言学习规划与展望。
- 概要设计说明书-模板(referrence)