- 优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是按照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。
- 堆的两个特性:
- 结构性:用数组表示的完全二叉树;
- 有序性:任一结点的关键字是其字数所有结点的最大值(或最小值)
- “最大堆(MaxHeap)”,也称“大顶堆”:最大值
- “最小堆(MinHeap)”,也称“小顶堆”:最小值
- 操作集:最大堆
H
MaxHeap
,元素item
ElementType
,主要操作有: MaxHeap CreateHeap( int MaxSize )
:创建一个空的最大堆;Boolean IsFull( MaxHeap H )
:判断最大堆H
是否已满;Insert( MaxHeap H, ElementType item )
:将元素item
插入最大堆H
。Boolean IsEmpty( MaxHeap H )
:判断最大堆H
是否为空;ElementType DeleteMax( MaxHeap H )
:返回H
中最大元素(高优先级)。
- 最大堆的创建(这里只是创建一个空堆):
- 插入:
- 最大堆的删除:取出根节点(最大值)的元素,同时删除堆的一个结点。其时间复杂度等于树高,即
- 最大堆的建立(这里是指在空堆的基础上往里面存数据):
- 方法1:通过插入操作,将个元素一个个插入到一个初始为空的堆中,最坏情况是每次都需要插入到堆底,即遍历一遍堆,而遍历一遍,所以时间代价最大是
- 方法2:在线性时间复杂度下建立最大堆。
- 将个元素按输入顺序存入,先满足完全二叉树的结构特性。
- 调整各结点位置,以满足最大堆的有序特性。