基本概念:

1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。

2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值。

定义:

1、堆是一颗完全二叉树;

2、堆中的某个结点的值总是大于等于(最大堆)或小于等于(最小堆)其孩子结点的值。

3、堆中每个结点的子树都是堆树。

堆的操作

假设原始数据为a[]={4,1,3,2,16,9.10.14.8.7},采用顺序存储对应的完全二叉树为:

堆的数据结构如下

struct MaxHeap
{EType *heap; //存放数据的空间,下标从1开始存储数据,下标为0的作为工作空间,存储临时数据。int MaxSize; //MaxSize是存放数据元素空间的大小int HeapSize; //HeapSize是数据元素的个数
};
MaxHeap H;

1、构造最大堆

基本思想:首先将每个叶子结点视为一个堆,再将每个叶子结点于其父节点一起构成一个包含更多结点的堆。所以在构造堆的时候,首先需要找到最后一个结点的父节点,从这个节点开始构造最大堆,直到该节点前面的所有分支节点都处理完毕。

注意: 在二叉树中,若当前节点的下标为 i, 则其父节点的下标为 i/2,其左子节点的下标为 i*2,其右子节点的下标为i*2+1;

2、初始化堆

void MaxHeapInit(MaxHeap &H)
{for(int i=H.HeapSize/2;i>=1;i--){H.heap[0]=H.heap[i];int son=i*2;while(son<H.HeapSize){if(son<H.HeapSize&&H.heap[son]<H.heap[son+1])son++;if(H.heap[i]>H.heap[son])break;else if(son<H.heapSize&&H.heap[son]>H.heap[son+1]{H.heap[son/2]=H.heap[son];son*=2;}}H.heap[son/2]=H.heap[0];}
}

下图是原始数据堆初始化的过程。

3、最大堆中插入节点

最大堆中插入节点,先在堆末尾插入该节点,然后按照堆的初始化过程将该节点放入到合适的位置。

void MaxHeapInsert(MaxHeap &H, EType &x)
{if(H.HeapSize==H.MaxSize) return false;int i=++H.HeapSize;while(i!=1&&x>H.heap[i/2]){H.heap[i]=H.heap[i/2];i/=2;}H.heap[i]=x;return true;
}

4\最大堆中删除节点

将最大堆的最后一个节点放到根节点,然后删除最大值,然后再把新的根节点放到合适的位置

void MaxHeapDelete(MaxHeap &H, EType &x)
{if(H.HeapSize==0) return false;x=H.heap[1];H.heap[0]=H.heap[H.HeapSize--];int i=1, son=i*2;while(son<H.HeapSize){if(son<H.HeapSize&&H.heap[son]<H.heap[son+1])son++;if(H.heap[i]>H.heap[son])break;H.heao[i]=H.heap[son];i=son;son*=2;}H.heap[i]=H.heap[0];return true;}

5、堆排序

#include<iostream>
using namespace std;void swap(int &a, int &b)
{int temp=a;a=b;b=temp;
}void quick_build(int a[], int len, int root)
{int left=root*2+1;int flag=left;while(left<len){int right=left+1;while(right<len&&a[right]>a[left])flag=right;}if(a[root]<a[flag]){swap(a[root],a[flag]);heap_build(a,len,flag);
}void quick_sort(int a[], int len)
{for(int i=len/2;i>0;i--)heap_build(a,len, i);for(int j=len-1;j>0;j--){swap(a[0],a[j]);heap_build(a,0,j);}  }

深入理解堆(最大堆,最小堆及堆排序)相关推荐

  1. C++实现最大堆最小堆

    目录 堆和栈的区别 最大堆与最小堆 最大堆的操作 最大堆的插入操作 最大堆的弹出操作 最大堆的C++代码实现 最小堆概念 最小堆的插入操作 最小堆的弹出操作 最小堆的C++代码实现 最大堆最小堆的应用 ...

  2. Golang实现最大堆/最小堆

    Golang实现最大堆/最小堆 参考: https://yangjiahao106.github.io/2019/01/15/golang-%E6%9C%80%E5%A4%A7%E5%A0%86%E5 ...

  3. 【二叉堆】实现最小堆和最大堆

    最小堆和最大堆采用完全二叉树的形式来存储不同数字的序列,在topK问题中有广泛应用.其满足中间节点大于左子树和右子树上所有节点值的特点,为保证其存储.查找和删除的遍历,通常采用数组的形式进行构建. 本 ...

  4. java 最小堆_堆排序 最大堆 最小堆 Java 实现

    堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...

  5. C++STL中的最大堆,最小堆

    堆,优先队列,头文件和队列是同一个#include<queue> #include<iostream> #include<queue> using namespac ...

  6. 最大堆最小堆的实现(C语言)

    ---------------- 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. ---------------- 堆是特殊的队列,从堆 ...

  7. C++ 最大堆最小堆与push_heap pop_heap

    make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...

  8. 堆 最小堆 最大堆 堆排序(小到大,大到小)

    导航 1.了解什么是堆 2.如何创建最小堆,最大堆 3.新增值在堆中如何进行 4.完整的堆排序,升序和降序(两种方式) ---------------------------------------- ...

  9. python 中的最大堆和最小堆(heapq库)

    目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...

  10. 将二叉树转化成最大堆或最小堆

    将二叉树转化成最大堆或最小堆: 最大堆: 1.堆树是一颗完全二叉树 2.父节点总是大于或等于他的孩子节点 3.堆树中每个节点的子树都是堆树. 最小堆的转化同理.

最新文章

  1. 不再使用快捷方式打开电脑软件!如何Windows+r 来打开一个你想要打开的软件软件?
  2. 从事单片机工作,C语言要达到什么水平?
  3. 智源研究院发布世界首个“机器学习通用数学符号集”
  4. Linux防火墙iptables学习
  5. Ubuntu下如何禁用IPv6
  6. 博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
  7. 性能优化18招提速宝典
  8. fatal error C1083: 无法打开包括文件:“stdio.h
  9. 数据结构(十三)树的遍历
  10. unity多边形uv地图
  11. [Windows] 【直播放映馆V9.0】Bilibili,斗鱼,虎牙,企鹅电竞,音乐电台,无广告看电影直播!...
  12. 深度学习网络训练技巧篇:神经网络初始化tricks---何凯明大神2018年新作(随机初始化网络)
  13. 【读书笔记】python3 网络爬虫开发实战(1)
  14. 学画画软件app推荐_一步一步教画画的app有哪些_2018手机画画软件哪个好呢_96u手游网...
  15. 通过气象站API获取天气信息
  16. php关键词分析工具,搜索引擎关键词查询分析工具
  17. linux安装redisDocker安装redis集群
  18. 山西二线城市里,藏着一家年入5亿的互联网卖酒公司
  19. Java作业 大于某个数的最小质数
  20. 赞csdn工作人员的响应速度

热门文章

  1. adb连接手机安装和使用,以及提示adb server version(31) doesn‘t match this client(39)解决办法
  2. wow怀旧服新开服务器最新消息,魔兽世界怀旧服服务器8月29日开放进度 新开服务器汇总...
  3. 用html5代码打出一个王字,王老师html零基础学习笔记第6课——-font-size+特殊字符...
  4. 了解ixgbe网卡驱动— 驱动注册(纯代码分享)
  5. 你的工作是挑水还是挖井
  6. 萨班斯法案_陷入该法案
  7. 计算机开机速度慢是什么原因,电脑开机速度总是比别人的慢,那是有原因的!...
  8. python做一个小游戏_12岁的少年教你用Python做小游戏
  9. 瑞昱网卡支持linux吗,Linux 上安装Realtek瑞昱网卡驱动
  10. 智能车摄像头算法——拐点