概念

性质: 1.堆是一颗完全二叉树,用数组实现。 
   2.堆中存储数据的数据是局部有序的。

最大堆:1.任意一个结点存储的值都大于或等于其任意一个子结点中存储的值。 
     2.根结点存储着该树所有结点中的最大值。

最小堆:1.任意一个结点存储的值都小于或等于其惹你一个子结点存储的值。 
     2.根结点存储着该树所有结点中的最小值。

无论最小堆还是最大堆,任何一个结点与其兄弟结点之间都没有必然联系。

STL中并没有把heap作为一种容器组件,heap的实现亦需要更低一层的容器组件(诸如list,array,vector)作为其底层机制。Heap是一个类属算法,包含在algorithm头文件中。虽然STL中关于heap默认调整成的是大顶堆,但却可以让用户利用自定义的compare_fuction函数实现大顶堆或小顶堆。heap的低层机制vector本身就是一个类模板,heap基于vector便实现了对各种数据类型(无论基本数据类型还是用户自定义的数据类型)的堆排(前提是用户自定义的数据类型要提供比较机制compare_fuction函数)。

STL里面的堆操作一般用到的只有4个。

他们就是

make_heap();、pop_heap();、push_heap();、sort_heap();

他们的头函数是algorithm

首先是make_heap();

他的函数原型是:

void make_heap(first_pointer,end_pointer,compare_function);

一个参数是数组或向量的头指针,第二个向量是尾指针。第三个参数是比较函数的名字
。在缺省的时候,默认是大跟堆。(下面的参数都一样就不解释了)

作用:把这一段的数组或向量做成一个堆的结构。范围是(first,last)

然后是pop_heap();

它的函数原型是:

void pop_heap(first_pointer,end_pointer,compare_function);

作用:pop_heap()不是真的把最大(最小)的元素从堆中弹出来。而是重新排序堆。它
把first和last交换,然后将[first,last-1)的数据再做成一个堆。

接着是push_heap()

void pushheap(first_pointer,end_pointer,compare_function);

作用:push_heap()假设由[first,last-1)是一个有效的堆,然后,再把堆中的新元素加
进来,做成一个堆。

最后是sort_heap()

void sort_heap(first_pointer,end_pointer,compare_function);

作用是sort_heap对[first,last)中的序列进行排序。它假设这个序列是有效堆。(当然
,经过排序之后就不是一个有效堆了)

#include<algorithm>  #include<cstdio>  using namespace std;  bool cmp(int a,int b) //比较函数  {  return a>b;  }  int main()  {  int i,number[20]={29,23,20,22,17,15,26,51,19,12,35,40};  make_heap(&number[0],&number[12]);  //结果是:51 35 40 23 29 20 26 22 19 12 17 15  for(i=0;i<12;i++)  printf("%d ",number[i]);  printf("\n");  make_heap(&number[0],&number[12],cmp);  //结果:12 17 15 19 23 20 26 51 22 29 35 40  for(i=0;i<12;i++)  printf("%d ",number[i]);  printf("\n");  //加入元素8  number[12]=8;  //加入后调整  push_heap(&number[0],&number[13],cmp);  //结果:8 17 12 19 23 15 26 51 22 35 40 20  for(i=0;i<13;i++)  printf("%d ",number[i]);  printf("\n");  //弹出元素8  pop_heap(&number[0],&number[13],cmp);  //结果:12 17 15 19 23 20 26 51 22 29 35 40  for(i=0;i<13;i++)  printf("%d ",number[i]);  printf("\n");  sort_heap(&number[0],&number[12],cmp);  //结果不用说都知道是有序的了!  for(i=0;i<12;i++)  printf("%d ",number[i]);  return 0;  }

  

转载于:https://www.cnblogs.com/inception6-lxc/p/8483845.html

堆以及stl堆的使用相关推荐

  1. STL堆算法性能分析与优化方法(GCC4.4.2 stl_heap.h源代码分析与改进方案)

    堆是常用的数据结构,经常用于实现优先队列中,huffman编码中的就用到了优先队列. 本质上就是用数组实现的完全二叉树保证父节点的关键码都大于或者等于其子节点的关键码(最大堆,反过来是最小堆),下图是 ...

  2. 堆(手写堆包含STL)

     文章目录 前言 一.堆的定义 二.堆的分类及性质(STL的用法) 1.堆的分类 2.STL的用法 3.堆的性质 三.手写堆(重点) 1.手写堆的思想 2.函数模块 3.操作模块 四.完整代码 + 注 ...

  3. C++的 STL堆 实现获取中位数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数: ...

  4. C++的STL 堆 实现获取数组堆第K大的数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章 ...

  5. C++ STL 中大根堆,小根堆的应用。

    1>优先队列:在C++中优先队列默认的是大根堆,如果用小根堆则加入greater. priority_queue<int, vector<int>, less<int&g ...

  6. 大根堆和小根堆的区别

    大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...

  7. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

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

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

  9. LeetCode Find K Pairs with Smallest Sums(大根堆、小根堆)

    问题:给出两个有序数组nums1,nums2,要求从两个数组中各取一个数,组成一对数据,输出和最小的k对 思路:方法1使用大根堆,当堆中元素个数小于k时,直接入堆.否则比较当前数据对与堆顶的元素,如果 ...

最新文章

  1. ora-14400插入的分区关键字未映射到任何分区---oracle数据库表过期问题
  2. 会做饭的机器人曰记_颜真卿《麻姑仙坛记》:苍劲古朴,体态沉雄,气象宏大...
  3. SpringBoot Mybatisplus 多数据源使用
  4. bzoj 1878: [SDOI2009]HH的项链(主席树)
  5. 个人打卡签到表html代码,考勤每日签到表模板
  6. 中国地图经纬度范围,用多个矩形表示大致范围
  7. 信息流广告投放分析实战案例!
  8. springboot模板项目搭建:代码生成器AutoGenerator
  9. 统计学中的十几个数据分析方法
  10. 乞丐的一句话,感动中国13亿人。
  11. SAP MM 采购订单中“Delivery Completed“ Indicator
  12. 页码在html中怎么设置,如何设置网页打印的网址、日期、页码等?
  13. excel日期怎么间隔填充_系列或相同日期的自动填充Excel日期
  14. 09- 京东客户购买意向预测 (机器学习集成算法) (项目九) *
  15. 3800 万条敏感记录在“裸奔”!微软这个默认配置把自己都“坑”了
  16. 模拟高校的三个老师同时分发80份学习笔记
  17. 阴影(shadow mapping)(硬阴影)
  18. 使用Ngrok配置免费的外网域名
  19. java毕业设计电商后台管理系统Mybatis+系统+数据库+调试部署
  20. js上传视频方法及监控进度

热门文章

  1. mysql current_MySQL中CURRENT_TIMESTAMP数据类型详解
  2. 【Python学习】 - 关于函数返回拷贝还是返回视图的几组函数汇总
  3. 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)
  4. *【HDU - 2473】Junk-Mail Filter (并查集--删点操作)
  5. Apollo进阶课程㉗丨Apollo控制技术详解——控制理论
  6. android adb 开机广播,Android中常用的adb指令
  7. 自定义函数删除字母C语言,[编程入门]自定义函数之字符提取-题解(C语言代码)...
  8. layui数据表格获取当前页数
  9. aspose转pdf横版_aspose实现Office转Pdf
  10. c语言判断字符串是不是回文_LeetCode 热题 HOT 100 5. 最长回文子串