1.堆
如果有一个关键码的集合
K = {
, , ,
…
,},把它的所有元素按完全二叉树的顺序存储方式存储
在一个一维数组中,则称为小堆(
或大堆
)
。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
堆的性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
创建堆
向上调整建堆
向下调整建堆
堆的插入
先插入一个10到数组的尾上,再进行向上调整算法,直到满足堆
向上调整算法
数组一个个循环插入时边插入边成堆,当插入新的元素时向上调整成新的堆
使用向上调整算法,每次孩子与父亲相比较,当孩子大于或小于父亲时进行交换,改变孩子的下标,再次进行判断然后交换,知道孩子的下标为0
堆的删除
向下调整算法
给出一个数组,逻辑上看做一颗完全二叉树。通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。
当已经成大堆或者小堆后想删元素,最好的办法是把堆的第一个元素与最后一个进行交换,当交换完成,堆中最大或最小的元素就到了最后一个结点,减小下标进行删除,此时堆顶的左右子树为大堆或者小堆,用向下调整算法,将父亲与孩子循环比较大小进行交换,形成新的堆,再次把堆顶元素与最后一个元素交换,使用向下调整成新的堆,反复进行即可删除堆
堆的排序 升序 降序
向上调整建堆,堆顶元素与最后一个元素交换,再次向上或向下调整,得到升序或降序