数据结构:优先队列(堆)

一些简单的实现

  • 简单链表
  • 二叉查找树

二叉堆(又称堆)

堆是完全二叉树,任意节点子树上的所有节点 <= 当前节点(有顺序)

完全二叉树:底层上的元素从左到右填入。

完全二叉树可以用数组表示

  • 对于数组中任一位置 i 上的元素,其左儿子在位置 2i 处,右儿子在位置 2i+1 处。它的父亲则在位置 i/2 处。

堆的插入操作

上率:检查下一个空位的父亲节点,父亲节点 > 插入值则将父亲节点移入当前空位,父亲节点 < 插入值则插入值放入当前位置。

堆的删除最小值操作

下率:取出最小的根节点,取堆的最后一个节点 last,若较小子节点 < last,较小子节点上浮,反之将 last 节点放入

降低关键字的值

上率

增加关键字的值

下率

删除P位置节点

先降低关键字的值到最小
然后再做 DeleteMin 操作

构建堆

先将关键字按任意顺序放入堆
然后用下面的算法排序

for( i = N/2; i > 0; i-- )
   PercolateDown( i ); // 下率

d-堆

所有的节点都有d个儿子

左式堆

斜堆

二项队列