最大堆(又叫大根堆、大顶堆)和最小堆是二叉堆的两种形式,一类很重要的数据结构,如用于堆排序等。

最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。

最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。

下面以大根堆为例,来说明其入堆和出堆的操作:

入堆,插入:向上渗透(先是插入堆的最后位置,然后按最大堆的规则调整到适当位置);

出堆,删除:向下渗透(第一个元素出堆,从第二层开始,较大的元素往上渗透,将最后一个元素赋值给倒数第二层上的当前元素。

代码:

#include using namespace std;const int MAX = 55;typedef struct Heap{    int sizeHeap;    int* heapData;}HEAP,*LPHEAP;LPHEAP createHeap(){    LPHEAP heap=(LPHEAP)malloc(sizeof(HEAP));    heap->sizeHeap=0;    heap->heapData=(int*)malloc(sizeof(int)*MAX);    return heap;}int size(LPHEAP heap){    return heap->sizeHeap;}int empty(LPHEAP heap){    return heap->sizeHeap==0;}void moveToCorrectPos(LPHEAP heap, int curPos)//向上渗透,curPos一般取最后一个元素的下标{    while(curPos>1)    {        int Max=heap->heapData[curPos];        int parentIndex=curPos/2;        if(Max>heap->heapData[parentIndex])        {            heap->heapData[curPos]=heap->heapData[parentIndex];            heap->heapData[parentIndex]=Max;            curPos=parentIndex;//向上移动        }        else        {            break;        }    }}void insertHeap(LPHEAP heap, int data) // 放到当前堆的最后面并按条件往上移{    ++heap->sizeHeap;    heap->heapData[heap->sizeHeap]=data;    moveToCorrectPos(heap,heap->sizeHeap);}int popHeap(LPHEAP heap){    int Max=heap->heapData[1];    int curPos=1;    int childIndex=curPos*2;    while(childIndex<=heap->sizeHeap)    {        int temp = heap->heapData[childIndex];        if(childIndex+1<=heap->sizeHeap && tempheapData[childIndex+1])        {            temp=heap->heapData[++childIndex];        }        heap->heapData[curPos]=temp;        curPos=childIndex;//下移一层        childIndex*=2;    }    heap->heapData[curPos]=heap->heapData[heap->sizeHeap];    --heap->sizeHeap;    return Max;}void main(){    LPHEAP heap=createHeap();    for(int i=1;i<11;++i)    {        insertHeap(heap,i);    }    for(i=1;i<11;++i)    {        printf("%d",heap->heapData[i]);    }    printf("");    while(!empty(heap))    {        printf("%d",popHeap(heap));    }    system("pause");}/*10 9 6 7 8 2 5 1 4 310 9 8 7 6 5 4 3 2 1*/

在STL算法库中,有一簇函数专门用来将某一个序列容器调整为大堆或小堆:

(以下函数参数_Compare,可以是less<>(),与大顶堆相关;或者greater<>(),与小顶堆相关)

make_heap(_RAIter,_RAIter,_Compare): 生成大顶堆或小顶堆;

push_heap(_RAIter,_RAIter,_Compare) :如果有向堆(容器)中插入(.push_back())元素,需要使用此函数来调整大堆或小堆;

pop_heap(_RAIter,_RAIter,_Compare) :将堆(容器)中的第一个元素与最后一个元素交换,除最后一个元素以外,前面的元素按大堆或小堆规则调整。由此,如果删除(.pop_back())最后一个元素,剩下的元素又是一个大堆或小堆。

具体细节见代码和注释:

#include #include #include #include using namespace std;void printVector(vector vc){    copy(vc.begin(),vc.end(),ostream_iterator(cout," "));cout<b;}bool lesser(int a,int b){return a vc, FP fp){//int n = hv.size();    //for(int i=0;i bigHeap;bigHeap.assign(dim,dim+cnt);    cout<())make_heap(bigHeap.begin(),bigHeap.end(),less()); // 缺省less()cout< smallHeap;smallHeap.assign(dim,dim+cnt);// 使用vector建立小堆(greater())make_heap(smallHeap.begin(),smallHeap.end(),greater());cout<());cout<

-End-

大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆相关推荐

  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. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

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

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

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

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

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

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

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

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

  8. C++大顶堆和小顶堆

    C++大顶堆和小顶堆 原理 大顶堆 小顶堆 大顶堆和小顶堆对比图 大顶堆和小顶堆的实现代码 vector和push_heap.pop_heap实现堆 建堆 调整堆 priority_queue实现堆 ...

  9. 【力扣刷题】剑指 Offer 40. 最小的k个数(大顶堆)

    题目: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例: 输入:arr = [3,2,1], k = 2 ...

最新文章

  1. 1哈哈欢迎使用CSDN-markdown编辑器
  2. 一毕业就拿50万年薪,超过90%的互联网公司都在砸钱抢AI人才!
  3. js中的Object.create(null) 和 {} 的区别
  4. [deviceone开发]-多种样式下拉菜单demo
  5. Unable to establish loopback connection异常解决
  6. java 时间 转化成数字_java时间转化数字
  7. 每日一乐,健康多滋味~~
  8. 数据库索引的使用及优化
  9. js判断是否为手机浏览器
  10. logistic regression编程作业--sigmoid function,Cost function and gradient,Evaluating logistic regression
  11. 数据挖掘--决策树ID3+k-means聚类分析西瓜数据
  12. Java中如何保证线程安全
  13. 【算法-LeetCode】121. 买卖股票的最佳时机(动态规划;贪心)
  14. UVA-12304 测试圆相关模板
  15. SA387Gr22合金板采购标书
  16. ssm(spring mvc+mybatis)+netty4开发qiq
  17. 利用ffmpeg实现Windows音视频录制
  18. CSS核心概念一把梭-基础部分
  19. Notes Twelfth Day-渗透攻击-红队-命令与控制
  20. 如何将白鹭引擎开发的游戏通过Egret Native发布到 GooglePlay平台

热门文章

  1. [问题解决] LaTex Error:Unknown graphics extension:.eps
  2. table数据表 边框特效
  3. HDU1878-欧拉回路(入门题+并查集)
  4. Android应用程序变量
  5. 【计算机网络复习】1.1.1 概念、组成、功能和分类
  6. 【剑指offer】面试题30:包含min函数的栈
  7. android蓝牙通信_使用Arduino构建OLED显示屏与Android手机接口的智能手表
  8. c语言微信备份文件,文件保存后自动刷新微信小程序
  9. mysql主从配置访问_Mysql主从配置,实现读写分离
  10. 计算机应用基础王秀娟,计算机应用基础课教学内容设计分析.doc