堆的合并、插入、删除、排序

通常是一个可以被看做一棵完全二叉树的数组对象。

完全二叉堆

结构性:逻辑结构需等同于完全二叉树
堆序性:堆顶点以外的每个节点都不大于其父节点(大顶堆)

Insert() deleteMax()操作时间复杂度正比于堆的高度h,均可在O(logn)时间内完成。
按照层次遍历的次序,若将所有节点组织为一个向量,堆中节点与向量的秩彼此一一对应。
有与向量支持低分摊成本的扩容调整,故随着堆的规模和内容不断的动态调整,除标准接口以外的操作所需的时间可以忽略不计。

若将节点v的编号记作i(v),则v的左孩子为2i(v)+1,右孩子为2i(v)+2,父节点(向下取整)(i(v)-1)/2。

元素插入

上滤

若堆非空,则新插入节点e必存在父亲。比较e与父亲的大小,若e≤父亲,则满足堆序性,不需要额外的操作。若e >父亲,则将e与父亲节点互换位置,这一操作满足局部堆序性。再将e与更高级的父亲进行比较,直到满足整体的堆序性,则上滤完成。
时间复杂度:操作时间复杂度正比于堆的高度h,最高不超过O(logn)时间内完成。

元素删除

下滤

删除堆顶点元素(最大值),将末尾词条e交换至堆顶。比较e与左右孩子的大小,若e≥左右孩子,则满足堆序性,不需要额外的操作。若e <父亲,则将e与左右孩子的大者互换位置,这一操作满足局部堆序性。再将e与左右孩子进行比较,直到满足整体的堆序性,则下滤完成。
时间复杂度:操作时间复杂度正比于堆的高度h,最高不超过O(logn)时间内完成。

建堆:

蛮力算法

若将n个词条逐个调用insert( ),第k轮消耗时间O(logk),累计耗时O(nlogn)。
自上而下的上滤:对于任意完全二叉树,只需自顶而下、自左向右针对其中每个节点实施一次上滤,即可成为完全二叉堆。对上滤而言,深度越小,所耗时间越短。

Floyd

自下而上的下滤:将所有词条组织为一棵完全二叉树后,秩序自底而上的反复套用这一算法,即可不断地将处于下层的堆合并成更高一层的堆。
只需自下而上、由深而浅的遍历所有内部节点,并对每个内部节点分别调用一次下滤。累计耗时O(n)。对下滤而言,高度越小,所耗时间越短。

蛮力算法低效率的根源,恰在其“自上而下的上滤”策略。对上滤而言,深度越小,所耗时间越短。而在完全二叉树中,深度小的节点远小于高度小的节点

堆排序

就地堆排序

思路基本与选择排序相同。将所有词条分成未排序和已排序两类,不断从前一类中取出最大者,顺序加至后一类中。
首单元词条为最大者。与末词条交x换,末词条x进行一次下滤,第二大值再次位于堆顶,以此往复,即可完成排序。

时间复杂度 O(nlogn)

由于向量结构的简洁性,实际运行效率往往高于其他O(nlogn)的算法。除了用于支持词条交换的一个辅助单元,几乎不需要更多的辅助空间,属于就地算法。高运行效率、低开发成本、低资源消耗。

左式堆

左倾性:任意节点左孩子npl不小于右孩子npl

合并、插入、删除
共b个节点、右侧链长度最多不超过logn

(左式堆) 时间复杂度O(logn)

插入、删除都是合并

你可能感兴趣的:(堆的合并、插入、删除、排序)