热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

堆,堆的创建,插入,删除,建立

什么是堆优先队列((PriorityQueue):特殊的“队列”,取出元素的顺序是依照元素的优先权ÿ

什么是堆

优先队列( (Priority Queue ):特殊的“ 队列” ,取出元素的顺序是依照元素的 优先权(关键字)大小,而不是元素进入队列的先后顺序。

优先队列的完全二叉树表示

在这里插入图片描述

bool Insert(MaxHeap H, Elemtype X)
{ /* 将元素X插入最大堆H&#xff0c;其中H->Data[0]已经定义为哨兵 */int i;if (IsFull(H)){printf("最大堆已满");return false;}i &#61; &#43;&#43;H->Size; /* i指向插入后堆中的最后一个元素的位置 */for (; H->Data[i / 2] < X; i /&#61; 2)H->Data[i] &#61; H->Data[i / 2]; /* 上滤X */H->Data[i] &#61; X; /* 将X插入 */return true;
}

H->Element[ 0 ] 是哨兵元素&#xff0c;它不小于堆中的最大元素。当插入的元素比任意元素都大&#xff0c;哨兵的存在使得H->Elements[0] > item; 顺环结束。
时间复杂度&#xff1a; O(log N)

最大堆的删除

取出根结点&#xff08;最大值&#xff09;元素&#xff0c;同时删除堆的一个结点。
用最后一个结点代替根结点&#xff0c;取根结点两孩子的较大的一个&#xff0c;若较大值大于此时的根节点&#xff0c;将该较大值移动至根结点&#xff0c;不断重复&#xff0c;直到找到最后一个结点该插入的位置。
在这里插入图片描述
完整c&#43;&#43;代码

#include
#include
using namespace std;#define Elemtype int
#define MAXDATA 1000 /* 该值应根据具体情况定义为大于堆中所有可能元素的值 */typedef struct HNode {Elemtype *Data; /* 存储元素的数组 */int Size; /* 堆中当前元素个数 */int Capacity; /* 堆的最大容量 */
}*Heap;typedef Heap MaxHeap; /* 最大堆 */
typedef Heap MinHeap; /* 最小堆 */MaxHeap CreateHeap(int MaxSize)
{ /* 创建容量为MaxSize的空的最大堆 */MaxHeap H &#61; (MaxHeap)malloc(sizeof(struct HNode));H->Data &#61; (Elemtype *)malloc((MaxSize &#43; 1)*sizeof(Elemtype));H->Size &#61; 0;H->Capacity &#61; MaxSize;H->Data[0] &#61; MAXDATA; /* 定义"哨兵"为大于堆中所有可能元素的值*/return H;
}bool IsFull(MaxHeap H)
{return (H->Size &#61;&#61; H->Capacity);
}bool Insert(MaxHeap H, Elemtype X)
{ /* 将元素X插入最大堆H&#xff0c;其中H->Data[0]已经定义为哨兵 */int i;if (IsFull(H)){printf("最大堆已满");return false;}i &#61; &#43;&#43;H->Size; /* i指向插入后堆中的最后一个元素的位置 */for (; H->Data[i / 2] < X; i /&#61; 2)H->Data[i] &#61; H->Data[i / 2]; /* 上滤X */H->Data[i] &#61; X; /* 将X插入 */return true;
}#define ERROR -1 /* 错误标识应根据具体情况定义为堆中不可能出现的元素值 */bool IsEmpty(MaxHeap H)
{return (H->Size &#61;&#61; 0);
}Elemtype DeleteMax(MaxHeap H)
{ /* 从最大堆H中取出键值为最大的元素&#xff0c;并删除一个结点 */int Parent, Child;Elemtype MaxItem, X;if (IsEmpty(H)) {printf("最大堆已为空");return ERROR;}MaxItem &#61; H->Data[1]; /* 取出根结点存放的最大值 *//* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */X &#61; H->Data[H->Size--]; /* 注意当前堆的规模要减小 */for (Parent &#61; 1; Parent * 2 <&#61; H->Size; Parent &#61; Child){Child &#61; Parent * 2;if ((Child !&#61; H->Size) && (H->Data[Child]<H->Data[Child &#43; 1]))Child&#43;&#43;; /* Child指向左右子结点的较大者 */if (X >&#61; H->Data[Child]) break; /* 找到了合适位置 */else /* 下滤X */H->Data[Parent] &#61; H->Data[Child];}H->Data[Parent] &#61; X;return MaxItem;
}/*----------- 建造最大堆 -----------*/
void PercDown(MaxHeap H, int p)
{ /* 下滤&#xff1a;将H中以H->Data[p]为根的子堆调整为最大堆 */int Parent, Child;Elemtype X;X &#61; H->Data[p]; /* 取出根结点存放的值 */for (Parent &#61; p; Parent * 2 <&#61; H->Size; Parent &#61; Child) {Child &#61; Parent * 2;if ((Child !&#61; H->Size) && (H->Data[Child]<H->Data[Child &#43; 1]))Child&#43;&#43;; /* Child指向左右子结点的较大者 */if (X >&#61; H->Data[Child]) break; /* 找到了合适位置 */else /* 下滤X */H->Data[Parent] &#61; H->Data[Child];}H->Data[Parent] &#61; X;
}void BuildHeap(MaxHeap H)
{ /* 调整H->Data[]中的元素&#xff0c;使满足最大堆的有序性 *//* 这里假设所有H->Size个元素已经存在H->Data[]中 */int i;/* 从最后一个结点的父节点开始&#xff0c;到根结点1 */for (i &#61; H->Size / 2; i>0; i--)PercDown(H, i);
}int main()
{Heap heap &#61; CreateHeap(20);int a[13] &#61; { MAXDATA, 79, 66, 43, 83, 30, 87, 38, 55, 91, 72, 49, 9 };int len &#61; sizeof(a) / sizeof(a[0]);heap->Data &#61; a;heap->Size &#61; len-1;BuildHeap(heap);for (int i &#61; 1; i <&#61; heap->Size; i&#43;&#43;)cout << heap->Data[i]<<" ";cout << endl << endl;cout << DeleteMax(heap) << endl;for (int i &#61; 1; i <&#61; heap->Size; i&#43;&#43;)cout << heap->Data[i] << " ";cout << endl << endl;if (Insert(heap, 99)){for (int i &#61; 1; i <&#61; heap->Size; i&#43;&#43;)cout << heap->Data[i] << " ";}
}


推荐阅读
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
黑m泽猫咪2009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有