c语言建立小根堆的算法,小根堆(Heap)的详细实现
堆的介绍
Heap是一种数据结构具有以下的特点:
1)完全二叉树
2)heap中存储的值是偏序
Min-heap: 父节点的值小于或等于子节点的值
Max-heap: 父节点的值大于或等于子节点的值
堆的存储
一般都用数组来表示堆,i结点的父结点下标就为(i–1)/2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。
由于堆存储在下标从0开始计数的数组中,因此,在堆中给定下标为i的结点时:
(1)如果i=0,结点i是根结点,无父结点;否则结点i的父结点为结点(i-1)/2;
(2)如果2i+1>n-1,则结点i无左子女;否则结点i的左子女为结点2i+1;
(3)如果2i+2>n-1,则结点i无右子女;否则结点i的右子女为结点2i+2。
堆的操作:小根堆插入元素
插入一个元素:新元素被加入到heap的末尾,然后更新树以恢复堆的次序。
每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于直接插入排序中将一个数据并入到有序区间中。需要从下网上,与父节点的关键码进行比较,对调。
堆的操作:删除小根堆堆的最小元素
按定义,堆中每次都删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,堆的元素个数-1,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点将一个数据的“下沉”过程。
堆的操作:创建堆
对于叶子节点,不用调整次序,根据满二叉树的性质,叶子节点比内部节点的个数多1.所以i=n/2 -1 ,不用从n开始。就是从最后一个有叶子结点的结点开始。
堆排序
如果从小到大排序,创建大堆建好之后堆中第0个数据是堆中最大的数据。取出这个数据,放在数组最后一个元素上,将当前元素数-1,再执行下堆的删除操作。这样堆中第0个数据又是堆中最大的数据,重复上述步骤直至堆中只有一个数据时,数组元素就已经有序。
小根堆的实现
#include
using namespace std;
const int DefaultSize = 50;
template
class MinHeap
{
public:
//构造函数:建立空堆
MinHeap(int sz=DefaultSize)
{
maxHeapSize = (DefaultSize < sz) ? sz : DefaultSize;
heap = new T[maxHeapSize];
currentSize = 0;
}
//构造函数通过一个数组建立堆
MinHeap(T arr[],int n)
{
maxHeapSize = (DefaultSize < n) ? n : DefaultSize;
heap = new T[maxHeapSize];
for(int i=0;i
{
heap[i] = arr[i];
}
currentSize = n;
int currentPos = (currentSize - 2) / 2;//找最初调整位置:最后分支结点
while (currentPos>=0)//自底向上逐步扩大形成堆
{
siftDowm(currentPos, currentSize - 1);//局部自上向下下滑调整
currentPos--;//再向前换一个分支结点
}
}
//将x插入到最小堆中
bool Insert(const T& x)
{
if(currentSize==maxHeapSize)
{
cout << "Heap Full!" << endl;
return false;
}
heap[currentSize] = x;//插入
siftUp(currentSize);//向上调整
currentSize++;//堆计数+1
return true;
}
bool RemoveMin(T& x)
{
if(!currentSize)
{
cout << "Heap Empty!" << endl;
return false;
}
x = heap[0];//返回最小元素
heap[0] = heap[currentSize - 1];//最后元素填补到根结点
currentSize--;
siftDowm(0, currentSize - 1);//自上向下调整为堆
return true;
}
void output()
{
for(int i=0;i
{
cout << heap[i] << " ";
}
cout << endl;
}
protected:
//最小堆的下滑调整算法
void siftDowm(int start, int end)//从start到end下滑调整成为最小堆
{
int cur = start;
int min_child = 2 * cur + 1;//先记max_child是cur的左子女位置
T temp = heap[cur];
while (min_child <=end)
{
if (min_childheap[min_child + 1])//找到左右孩子中最小的一个
min_child++;
if(temp<=heap[min_child])
break;
else
{
heap[cur] = heap[min_child];
cur = min_child;
min_child = 2 * min_child + 1;
}
}
heap[cur] = temp;
}
//最小堆的上滑调整算法
void siftUp(int start)//从start到0上滑调整成为最小堆
{
int cur = start;
int parent = (cur - 1) / 2;
T temp = heap[cur];
while (cur>0)
{
if(heap[parent]<=temp)
break;
else
{
heap[cur] = heap[parent];
cur = parent;
parent = (parent - 1) / 2;
}
}
heap[cur] = temp;//回放temp中暂存的元素
}
private://存放最小堆中元素的数组
T* heap;
int currentSize;//最小堆中当前元素个数
int maxHeapSize;//最小堆最多允许元素个数
};
//------------------------主函数-------------------------
int main(int argc, char* argv[])
{
MinHeap h;
h.Insert(8);
h.Insert(5);
h.Insert(7);
h.Insert(9);
h.Insert(6);
h.Insert(12);
h.Insert(15);
h.output();
int out;
cout << static_cast (h.RemoveMin(out)) << endl;
h.output();
int arr[10] = { 15,19,13,12,18,14,10,17,20,11 };
MinHeap h1(arr,10);
h1.output();
}
05-树6. Path in a Heap (25) 小根堆
05-树6. Path in a Heap (25) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.patest.cn/contes ...
基本数据结构——堆(Heap)的基本概念及其操作
基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...
scala写算法-用小根堆解决topK
topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...
T-shirt buying CodeForces - 799B (小根堆+STL)
题目链接 思路: 由于题目说了只有1,2,3,三种色号的衣服,然后开三个对应色号的小根堆, 我是根据pair 创建了一个以价格小的优先的优先队列. pair中的另外一个i ...
数据结构&;堆&;heap&;priority_queue&;实现
目录 什么是堆? 大根堆 小根堆 堆的操作 STL queue 什么是堆? 堆是一种数据结构,可以用来实现优先队列 大根堆 大根堆,顾名思义就是根节点最大.我们先用小根堆的建堆过程学习堆的思想. 小根 ...
CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
poj2513 Fence Repair(小根堆)
Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...
堆(heap)和栈(stack)几点认识
堆(heap)和栈(stack)主要的区别由以下几点:1.管理方式不同:2.空间大小不同:3.产生碎片不同:4.生长方向不同:5.分配归属不同:6.分配效率不同:7.存取效率不同:管理方式:对于栈来讲 ...
(转)堆heap和栈stack
一 英文名称 堆和栈是C/C++编程中经常遇到的两个基本概念.先看一下它们的英文表示: 堆――heap 栈――stack 二 从数据结构和系统两个层次理解 在具体的C/C++编程框架中,这两个概念并不 ...
随机推荐
poj1985 Cow Marathon (求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3195 Accepted: 1596 Case ...
sendto频率过快导致发送丢包
编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络环境:1000M,直连,多网卡 系统:Linux ver ...
css中图片等比例缩放
li img{ display: inline-block; max-height: 60px; max-width: 60px; vertical-align: middle; }
oracle表分区
注:新建分区表前要先准备好要用的表空间 一. oracle分区类型: 范围分区(Range分区) 列表分区(List分区) 散列分区(Hash分区) 组合分区(Composite Partitioni ...
PHP文件系统处理相关操作
【30】透彻了解inlining 的里里外外
1.inline方法相当于文本替换,不需要承担方法调用的额外开销,同时还有潜在的优势,文本替换后,编译器会进行代码优化.而对于方法调用,编译器没有能力进行代码优化. 2.显而易见,inline方法往往 ...
从java程序员到CTO的成长路线图
很多新人不知道从事java开发,具体的发展路径是怎么样的,甚至很多人都不能区分程序猿和攻城师的区别.包括不少小白,从事java开发都半年,甚至1年了,对职业发展还没有清晰的认证.这非常不利于自己的发展 ...
Mysql备份数据库的一种方法
今天添加了一个数据库自动备份的模块,mysql数据备份的方法有很多,可以对单个数据库备份,可以多个数据库备份,也可以对某一个表进行备份,可以只备份数据库的结构不备份数据,可以根据需要做不同处理,正好现 ...
使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework
在Xamain 未被收购之前,这货monodroid.exe 就是一个打包的绑定...无奈 配置环境复杂,未能实现 ...有mono运行时就行了..不折腾了 玛德 让C#程序独立运行(脱离 .NET ...
c语言建立小根堆的算法,小根堆(Heap)的详细实现相关推荐
- C语言实现选择排序——堆排序(大根堆、小根堆)
C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...
- 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法
内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...
- C语言(CED)排序算法总结。比较完整和详细
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 内部排序算法有:直接插入排序,折半插入排序, ...
- Java数据结构与算法:堆
1. 堆的定义 设有n个数据元素的关键字为(k0.k1.-.kn-1),如果它们满足以下的关系:ki<= k2i+1且ki<= k2i+2(或ki>= k2i+1且ki>= k ...
- 数据结构与算法之堆与堆排序
在数据结构中,堆其实就是一棵完全二叉树.我们知道内存中也有一块叫做堆的存储区域,但是这与数据结构中的堆是完全不同的概念.在数据结构中,堆分为大根堆和小根堆,大根堆就是根结点的关键字大于等于任一个子节点 ...
- Dijkstra算法及堆优化
1.有向无环图的单源点最短路 其实跟之前说的最长路是一样的 思路:广搜(拓扑排序)+ DP 如下图所示: 2.一般图的单源点最短路 Dijkstra(迪杰斯特拉)算法 算法思路:每次找离起点最近的那个 ...
- 堆的向下调整算法、堆的向上调整算法、堆的实现、Topk问题
目录 一.堆 1.堆的概念 2.堆的性质 3.堆的分类 二.堆的向下调整算法 三.堆的创建 四.堆的向上调整算法 五.堆的实现 1.堆的初始化 2.堆的销毁 3.堆的插入 4.堆的删除 5.获取堆顶的 ...
- 基于动态数组建立二叉堆、批量建堆-JAVA
文章目录 1.堆的数据结构 2.添加 3.删除 4.代码实现 1.首先定义接口 2.写实现类 5.如何批量建堆 1.堆的数据结构 如果任意节点的值总是≥子节点的值,称为:最大堆.大根堆.大顶堆 如果任 ...
- C语言建立有向图的邻接表及其遍历操作
1 /*C语言建立有向图的邻接表及其遍历操作*/ 2 #include"stdio.h" 3 #include"stdlib.h" 4 //图的邻接矩阵储存结构 ...
最新文章
- C# 异步读取数据库里面的数据与绑定UI的解决办法
- Android与iOS:谁更适合HTML 5?
- html 文字不可选择,有没有办法在HTML页面上使文本无法选择?
- 优秀设计师必备:视觉传达设计与视觉思维
- O太多,具体都代表什么呢?
- Maven实战:pom.xml与settings.xml
- 【活动】PMcaff免费培训之终结版扩招名额----20名额等你来抢
- IPC\DVS\DVR与NVR之间的区别
- Install/Remove of the Service Denied错误解决
- textbox的textmode取为multiline多行时,其maxlength不起作用
- android gps导航省电,一种GPS导航中省电的系统和方法与流程
- 我在Google用AI研究基因,入门从吴恩达的课程开始
- 复杂车间调度问题三维析取图建模系列预告
- 苹果提交版本后显示”缺少出口合规证明“的解决办法
- 5G信道编码技术取得新突破,极化码同时满足ITU三大应用需求
- win10 Matlab2017a .m相关文件关联
- “Failed to load response data“ django@xframe_options_exempt 网站不许 Firefox 显示被嵌入的网页
- pointer-events用法
- 长沙“一江两岸”新网红,看铜官古镇的“文和游”
- 互斥锁 、 自旋锁、读写锁和RCU锁
热门文章
- android中级培训,Android 中级学习心得
- 你连基础的JVM运行时内存布局都忘了?Java面试题及解析
- ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements
- PMI-ACP练习题(15)
- 树莓派Linux入门教程
- RV1126笔记二:rkmedia测试
- 十字军东征一些君主AI的对话
- 照书写轮子——图的五种常见接口的实现(DFS、BFS、最小生成树问题、最短路径问题、关键路径问题)
- 中望CAD的引线标注格式怎么改_没想到啊,原来CAD命令还可以这样学习
- 如何从外网SSH访问家中的树莓派?