最小堆的建立 插入 与删除

堆是完全二叉树,完全二叉树最大的特点就是 把数据储存在数组里 通过父子结点的关系来做  不用实际建树  parent=leftchild/2; leftchild=2*parent  右就加1这儿指的是序号关系,储存的时候注意是利用树的逻辑图 从上到下 从左到右编号12345....。

建堆:实际是把数据先放入数组(注意下标从1开始),对应逻辑图,写调整代码,我的基本思路是从数组末尾开始,对应元素与其父节点比较,满足条件就换值,并且对被换的调用调整函数(要单独写个调整函数)因为被换的一个是可能不满足堆的要求的。然后一个while循环这样的操作一直做到第2个元素.一个最小堆或最大堆就可以了

删除操作:把数组最后元素替换第一个,把最后一个赋个特殊值。然后调用调整函数就OK。这样的好处是数组中实际的元素保持连续的,方便操作,而且代码简单。

插入操作;同理和删除差不多,把插入的数放在数组最后(这种方法很好),调用调整函数。

调整函数:接收元素下标,判断它的左儿子和右儿子(通过下标关系很好找)大小,把满足条件的换上来,对被换的继续调用调整函数递归直到被换的元素满足条件,大于或小于左右儿子。细节注意数组越界等问题。

一个插入和删除操作的时间约等于调用函数的时间复杂度,调用函数最多递归树的高度次也就是logn(n个结点),那么时间这三种操作的时间复杂度就是logn。

时间: 2024-10-29 10:46:35

最小堆的建立 插入 与删除的相关文章

最大(小)堆初始化,插入,删除,及利用其排序实现

#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define esp 1e-8 //#define lson l, m, rt<<1 //#define rson m+1, r, rt<<1|1 #define sz(x) ((int)((x).size())) #define pf(x) ((x)*(x)) #define pb push_back #define pi acos(

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

最小堆(优先队列)基本概念,即一个完整建立,插入,删除代码

堆(优先队列)priority queue特殊的队列,取出元素的顺序是依照元素的优先权(关键字)大小,而出元素进入队列的先后顺序操作:查找最大值(最小值),删除(最大值) 数组:链表:有序数组:有序链表: 采用二叉搜索树? NO 采用完全二叉树 YES堆的连个特性结构性:用数组表示的完全二叉树:有序性:任一结点的关键字是其字树所有结点的最大值(或最小值) 最大堆(MaxHeap)也称大顶堆:最大值 最小堆(MinHeap)也称"小顶堆":最小值 从根节点到任意结点路径上结点序列的有序性

堆的插入、删除和建立操作,堆排序

1.        堆 堆:n个元素序列{k1,k2,...,ki,...,kn},当且仅当满足下列关系时称之为堆: (ki <= k2i,ki <= k2i+1) 或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4,...,n/2) 若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左.右孩子结点的值.由此,若序列{k1,k2,…,kn}是堆,则堆顶元

堆的动态操作(插入、删除、调整)

堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树.最小堆便是每个节点的值都<=其左右孩子值的完全二叉树. 设有n个元素的序列{k1,k2,...,kn},当且仅当满足下列关系时,称之为堆. 堆的三种基本操作(以下以最大堆为例): ⑴最大堆的插入 由于需要维持完全二叉树的形态,需要先将要插入的结点x放在最底层的最右边,插入后满 足完全二叉树的特点: 然后把x依次向上调整到合适位置满足堆的性质,例如下图中插入80,先将80放在最后,然后两次上浮到合适位置.

《github一天一道算法题》:堆算法接口实现(堆排序、堆插入和堆取最值并删除)

看书.思考.写代码! /********************************************* * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:堆排序实现,另外实现接口:取堆最大值并删除.堆插入 * 思路:堆是在顺序数组原址上实现的,利用完全二叉树的性质,更具最大堆和最小堆的定义实现的. * 经典应用场景:内存中堆数据管理 * 空间复杂度:堆排序是在原址上实现的,为0 * 时间复杂度:堆排序为O

堆 的取最值删除操作和插入操作

堆的删除 按定义,堆中每次都只能删除第0个数据.为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整.调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点.相当于从根结点将一个数据的"下沉"过程. 堆的插入 每次插入都是将新数据放在数组最后.可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中--这就类似于直接插入排序中将

单链表(建立、插入、删除、打印)

单向链表创建 链表是动态分配存储空间的链式存储结构. 其包括一个"头指针"变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址. 链表中每一个元素称为"结点",每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域.指针域中存储的即是链表的下一个结点存储位置,是一个指针.多个结点链接成一个链表. 最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没

最小堆_最大堆

在大数查找中会遇到一类问题,例如在100亿条数据中找出 最大的(最小的) 前1000个元素.以int型4Byte为例,有1*1010*4 B = 4*1010/(230) B = 37.25G. 直接读取到内存中显然不合适,那么就需要: 首先,读取前1000个元素,建立一个最小堆(最大堆): 其次,之后每读取一个元素就与最小堆根元素(1000个数中最小值)进行比较: 如果,新元素大于(小于)堆顶元素 则,删除堆顶元素,将新元素插入堆顶.然后调整堆序,删除堆顶....循环往复 #define le