堆的介绍

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&period; Path in a Heap &lpar;25&rpar; 小根堆

05-树6. Path in a Heap (25) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.patest.cn/contes ...

基本数据结构——堆&lpar;Heap&rpar;的基本概念及其操作

基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

scala写算法-用小根堆解决topK

topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简 ...

T-shirt buying CodeForces - 799B (小根堆&plus;STL)

题目链接 思路: 由于题目说了只有1,2,3,三种色号的衣服,然后开三个对应色号的小根堆, 我是根据pair 创建了一个以价格小的优先的优先队列. pair中的另外一个i ...

数据结构&amp&semi;堆&amp&semi;heap&amp&semi;priority&lowbar;queue&amp&semi;实现

目录 什么是堆? 大根堆 小根堆 堆的操作 STL queue 什么是堆? 堆是一种数据结构,可以用来实现优先队列 大根堆 大根堆,顾名思义就是根节点最大.我们先用小根堆的建堆过程学习堆的思想. 小根 ...

CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)

CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

poj2513 Fence Repair&lpar;小根堆&rpar;

Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...

堆&lpar;heap&rpar;和栈&lpar;stack&rpar;几点认识

堆(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&num;桌面应用程序脱离net framework

在Xamain 未被收购之前,这货monodroid.exe  就是一个打包的绑定...无奈 配置环境复杂,未能实现 ...有mono运行时就行了..不折腾了 玛德 让C#程序独立运行(脱离 .NET ...

c语言建立小根堆的算法,小根堆(Heap)的详细实现相关推荐

  1. C语言实现选择排序——堆排序(大根堆、小根堆)

    C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...

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

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

  3. C语言(CED)排序算法总结。比较完整和详细

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存 内部排序算法有:直接插入排序,折半插入排序, ...

  4. Java数据结构与算法:堆

    1. 堆的定义 设有n个数据元素的关键字为(k0.k1.-.kn-1),如果它们满足以下的关系:ki<= k2i+1且ki<= k2i+2(或ki>= k2i+1且ki>= k ...

  5. 数据结构与算法之堆与堆排序

    在数据结构中,堆其实就是一棵完全二叉树.我们知道内存中也有一块叫做堆的存储区域,但是这与数据结构中的堆是完全不同的概念.在数据结构中,堆分为大根堆和小根堆,大根堆就是根结点的关键字大于等于任一个子节点 ...

  6. Dijkstra算法及堆优化

    1.有向无环图的单源点最短路 其实跟之前说的最长路是一样的 思路:广搜(拓扑排序)+ DP 如下图所示: 2.一般图的单源点最短路 Dijkstra(迪杰斯特拉)算法 算法思路:每次找离起点最近的那个 ...

  7. 堆的向下调整算法、堆的向上调整算法、堆的实现、Topk问题

    目录 一.堆 1.堆的概念 2.堆的性质 3.堆的分类 二.堆的向下调整算法 三.堆的创建 四.堆的向上调整算法 五.堆的实现 1.堆的初始化 2.堆的销毁 3.堆的插入 4.堆的删除 5.获取堆顶的 ...

  8. 基于动态数组建立二叉堆、批量建堆-JAVA

    文章目录 1.堆的数据结构 2.添加 3.删除 4.代码实现 1.首先定义接口 2.写实现类 5.如何批量建堆 1.堆的数据结构 如果任意节点的值总是≥子节点的值,称为:最大堆.大根堆.大顶堆 如果任 ...

  9. C语言建立有向图的邻接表及其遍历操作

    1 /*C语言建立有向图的邻接表及其遍历操作*/ 2 #include"stdio.h" 3 #include"stdlib.h" 4 //图的邻接矩阵储存结构 ...

最新文章

  1. C# 异步读取数据库里面的数据与绑定UI的解决办法
  2. Android与iOS:谁更适合HTML 5?
  3. html 文字不可选择,有没有办法在HTML页面上使文本无法选择?
  4. 优秀设计师必备:视觉传达设计与视觉思维
  5. O太多,具体都代表什么呢?
  6. Maven实战:pom.xml与settings.xml
  7. 【活动】PMcaff免费培训之终结版扩招名额----20名额等你来抢
  8. IPC\DVS\DVR与NVR之间的区别
  9. Install/Remove of the Service Denied错误解决
  10. textbox的textmode取为multiline多行时,其maxlength不起作用
  11. android gps导航省电,一种GPS导航中省电的系统和方法与流程
  12. 我在Google用AI研究基因,入门从吴恩达的课程开始
  13. 复杂车间调度问题三维析取图建模系列预告
  14. 苹果提交版本后显示”缺少出口合规证明“的解决办法
  15. 5G信道编码技术取得新突破,极化码同时满足ITU三大应用需求
  16. win10 Matlab2017a .m相关文件关联
  17. “Failed to load response data“ django@xframe_options_exempt 网站不许 Firefox 显示被嵌入的网页
  18. pointer-events用法
  19. 长沙“一江两岸”新网红,看铜官古镇的“文和游”
  20. 互斥锁 、 自旋锁、读写锁和RCU锁

热门文章

  1. android中级培训,Android 中级学习心得
  2. 你连基础的JVM运行时内存布局都忘了?Java面试题及解析
  3. ValueError: Length mismatch: Expected axis has 2 elements, new values have 1 elements
  4. PMI-ACP练习题(15)
  5. 树莓派Linux入门教程
  6. RV1126笔记二:rkmedia测试
  7. 十字军东征一些君主AI的对话
  8. 照书写轮子——图的五种常见接口的实现(DFS、BFS、最小生成树问题、最短路径问题、关键路径问题)
  9. 中望CAD的引线标注格式怎么改_没想到啊,原来CAD命令还可以这样学习
  10. 如何从外网SSH访问家中的树莓派?