此处默认二叉大根堆
描述:一棵树,完全二叉(i的左孩子为2i,右为2i+1),对于每个节点,它的孩子键值小于它,优先队列就是用堆实现的
性质:1.树根为最大点(堆顶),故不断重复 取顶→删顶就能得到排序序列(堆排序)
2.此结构决定了不能在里面找任意元素(数组实现不服)或者迭代,(所以stl的优先队列不能用这俩操作)
操作:1.基础操作:节点的上浮与下沉:
上浮:一个节点,若其父亲小于它,交换它和它父亲,重复执行
下沉:一个节点,若其孩子大于它,交换它和它的值大的儿子,重复执行
声明“最后一个节点”:最下层最右边那个节点
2.插入节点:把这个点作为最后一个节点插入,然后对他进行上浮
3.删除节点:把最后一个节点的值赋到这个节点上并删除最后那个节点,然后下沉(问题又回到了怎么找这个节点上)
4.对一个数组建堆:将此数组看做数组实现的堆,从后向前一个个执行上浮的操作