1》优先队列:在C++中优先队列默认的是大根堆,如果用小根堆则加入greater.

priority_queue<int, vector<int>, less<int>>s;//less表示按照递减(从大到小)的顺序插入元素
priority_queue<int, vector<int>, greater<int>>s;//greater表示按照递增(从小到大)的顺序插入元素

不写第三个参数或者写成less都是大根堆。greater是小根堆。

2》实际应用中我们借助于数组vector来建堆。

vector<int> a;
make_heap(a.begin(),a.end(), less<int>() );//建立大根堆
make_heap(a.begin(),a.end(), greater<int>() );//建立小根堆
push_heap(a.begin(),a.end());//将最后一个元素插入堆中(堆自动调整)
pop_heap(a.begin(),a.end());//将第一个元素从堆中删去(堆自动调整),并放到最后

3》举例:

/*
【502】给定一个整数数组,如何快速地求出数组中第k小的数。假如数组为:{4,0,1,0,2,3}。
*/
#if 1
int getMin(int* a,int len, int k) {vector<int>V;V.assign(a, a + len);int res;for(int i=0;i<k;i++){make_heap(V.begin(), V.end(), greater<int>());//把greater去掉就变成了小根堆,本题就变成求第k个最大值。pop_heap(V.begin(), V.end());res = V[V.size()-1];V.pop_back();}return res;
}
int main() {int a[6] = { 4,0,1,0,2,3 };cout << getMin(a, 6, 4) << endl;return 0;
}
#endif

第四小的数字是:

其他一些关于堆的函数用法 参照:
其他函数应用

/*
真题496:每20个数组,每个数组有50个元素,并且使有序的,现在如何在这20*500个数组中找出排名前5的数。
*/
#if 0
#define rows  3
#define cols  5
//int num[rows][cols] = { {29,17,14,2,1},{19,17,16,15,6},{30,25,20,14,5} };
int num[rows][cols] = { {1,2,14,17,29},{6,15,16,17,19},{5,14,20,25,30} };
struct Node {int * p;//指向数组的指针,便于取下一个数字bool operator<(const struct Node& node)const {return *p > *node.p;}};
void gettop(int k){struct Node arr[rows];int* res = new int[k];for (int i = 0; i < rows; ++i)arr[i].p = num[i];//初始化指针指向各行的首位//优先队列默认是大堆,这块是自己去设置的大堆。priority_queue<Node>myq(arr, arr + rows);for (int j = 0; j < k && j < cols; ++j) {Node tmp = myq.top();myq.pop();res[j] = *tmp.p;tmp.p++;myq.push(tmp);}for (int i = 0; i < k; ++i) {cout << res[i]<<" ";}cout << endl;
}
int main() {int k = 5;gettop(5);return 0;
}
#endif

C++ STL 中大根堆,小根堆的应用。相关推荐

  1. 堆——神奇的优先队列 大根堆小根堆详解,附小根堆C++代码实现与STL相关

    文章目录 前置知识 堆操作 小根堆插入 代码实现 小根堆删除 代码实现 测试代码 STL实现--priority_queue 1.使用 2.创建 3.成员函数 前置知识 堆是一个完全二叉树(最后一层可 ...

  2. 哈夫曼编码之大根堆小根堆揭西县

    哈夫曼编码 根据数据出现的频率对数据进行编码,从而压缩原始数据. 例如对于一个文本文件,其中各种字符出现的次数如下: a : 10 b : 20 c : 40 d : 80 可以将每种字符转换成二进制 ...

  3. 二叉堆 | 大根堆 小根堆

    目录 何为二叉堆 二叉堆的调整 最大堆 最大堆的插入操作 最大堆的删除操作 最大堆的构建 最大堆code 最小堆 小根堆的插入操作 最小堆的删除操作 最小堆的构建 最小堆code 二叉堆的存储方式 何 ...

  4. day36: 数据流中的中位数(大根堆小根堆)

    问题描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. ...

  5. 二叉堆------小根堆

    二叉堆是完全二叉树,每个结点中存有一个元素. 小根堆堆性质:父亲的权值不大于儿子的权值. 插入操作 插入操作是指向二叉堆中插入一个元素,要保证插入后也是一棵完全二叉树. 最简单的方法就是,最下一层最右 ...

  6. STL中heap算法(堆算法)

     ①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template ...

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

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

  8. 大根堆的删除c语言,大根堆和小根堆的C语言实现

    大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程 1.首先涉及到一个堆的调整,这也是算法的核心部分.假设树中,节点i的子树已经为两个大根堆.这两个子树再加上i节点的话,可能是大根堆也可能不是, ...

  9. 堆(大根堆、小根堆)

    完全二叉堆 堆又可称之为完全二叉堆.这是一个逻辑上基于完全二叉树.物理上一般基于线性数据结构(如数组.向量.链表等)的一种数据结构. 完全二叉树的存储结构 学习过完全二叉树的同学们都应该了解,完全二叉 ...

最新文章

  1. chgrp 简明笔记
  2. 如何在maven环境中设置JVM参数
  3. 当 TiDB 与 Flink 相结合:高效、易用的实时数仓
  4. php 随机在文章中添加锚文本_SEO站长布局锚文本时的7大注意事项
  5. frestadmin多样式响应式后台HTML模板
  6. 主成分分析(PCA)-最大方差解释
  7. 解决VMware在Windows 7上无法上网的问题
  8. CodeProject - 在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)...
  9. 力扣 二叉搜索树的最小绝对差
  10. 对话框:创建对话框模板和修改对话框属性
  11. Python 3 实现选择排序
  12. python中常用的函数有哪些_python里常用的函数类型
  13. leetcode Submission Details
  14. ubuntu中录制gif
  15. 20120912新工作感想
  16. 实验四——DPCM编码(1bit、2bit、4bit、8bit量化)
  17. 固定table第一列
  18. python爬取公众号文章_python爬取微信公众号历史文章
  19. Java— 齐头并进完成任务—多线程
  20. MVC中方便的[Authorize],加上这特性,就可以加上登录验证

热门文章

  1. 微信小程序电商商城系统怎样搭建?
  2. HDU, 3579 Hello Kiki
  3. buildroot编译出错(2020-09-27)
  4. java gui是什么_Java GUI编程(一)
  5. python中da_python数据类型一
  6. word里公式后面标号怎么对齐,Word里面公式后面的编号如何与公式最后一行对齐?...
  7. 用KUSTO查询语句(KQL)在Azure Data Explorer Database上查询LOG实战
  8. Java调整图片大小合并PNG图片生成ICON(保持背景透明)
  9. 不重启显示新增硬盘(虚拟机)
  10. MACD指标精粹讲解