堆(heap)
优先队列:特殊的队列,取出元素的顺序是按照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序
采用数组或链表实现优先队列
数组:
- 插入,元素总是插入尾部 O(1)
- 删除,查找最大(或最小)关键字O(n),从数组中删去需要移动元素O(n)
链表
- 插入,元素总是插入链表的头部 O(1)
- 删除,查找最大(或最小)关键字O(n),删去结点 O(1)
有序数组
- 插入,找到合适的位置O(n)或O(log2(n)),移动元素并插入
- 删除,删去最后一个元素O(1)
用二叉树进行存储
采用二叉树结构,重点考虑删除最大值
堆,用完全二叉树实现,都满足任何一个结点值都比他左右两边你的结点值大
堆具有两个特性
- 结构性,用数组表示的完全二叉树
- 有序性,任一结点的关键字是其子树所有结点的最大值或最小值
- 最大堆,大顶堆,最大值
- 最小堆,小顶堆,最小值
- 从根结点到任何结点路径上结点序列的有序性
数据对象集,完全二叉树,每个结点的元素值不小于其子结点的元素值
主要操作
MaxHeap Crearte(int maxsize):创建一个空的最大堆
Boolean IsFull(MaxHeap H):判断最大堆H是否已满
Insert(MaxHeap H,elementtype item):将元素item插入最大堆H
Boolean IsEmpty(MaxHeap H),判断最大堆H是否为空
ElementType DeleteMax(MaxHeap H),返回H中最大元素(高优先级)
堆的创建
struct heapstruct
{
element* elements;//存储堆元素的数组
int size;//堆的当前元素个数
int capacity;//堆的最大容量
};
maxheap create(int maxsize)
{
//创建容量为maxsize的空的最大栈
maxheap h = (maxheap)malloc(sizeof(struct heapstruct));
h->elements = (element*)malloc((maxsize + 1) * sizeof(int));
h->size = 0;
h->capacity = maxsize;
h->elements[0] = maxdata;
//定义哨兵为大于堆中所有可能元素的值,便于以后更快操作
return h;
}
堆的插入
//最大堆的插入
//算法:将新增结点插入到从其父节点到根节点的有序序列中
void insert(maxheap h, element item)
{//将元素item插入最大值h,其中h->elements[0]已经定义为哨兵
int i;
if (isfull(h))
{
cout << "最大堆已满" << endl;
return;
}
i =