完全二叉堆

逻辑上等同于完全二叉树,物理上用向量实现。 堆序性:处处满足 H[i] <= H[Parent(i)]根节点为最大值

插入

插入到向量末尾(完全二叉树底层),检查和父亲的大小关系

  • 若父亲更大或已经是根,结束插入
  • 若父亲更小,交换(此时兄弟的堆序性也可以保证) 只可能与父亲节点交换并上升一层,最多上升 层,时间复杂度为 从期望角度上讲,时间复杂度为

删除

将向量末尾的元素替换到首位,向下检视孩子和自身的大小关系

  • 若比两个孩子都大,结束
  • 若比其中之一小,与这个孩子交换,重复
  • 若比两个孩子都小,与其中较大者交换,重复 最多下降 层,时间复杂度为 数学期望也为

建堆

自上而下的上滤

逐个遍历,并视为插入。 时间复杂度为 此时花了 的时间得到偏序关系,而本可以通过排序得到全序关系,必然可以优化……

自下而上的下滤

Floyd 建堆法

Floyd 建堆法

将叶子节点视为含有单个元素的堆,自下而上地下滤,每次合并两个堆。 每个内部节点的调整时间正比于高度而非深度。 时间复杂度为

Link to original

堆排序

选择排序中,如果用堆替代向量,可以在 内找到前缀的最大值,总时间复杂度为 每次只需将首元素和当前末元素交换并执行下滤。