插入:
对于一个大顶堆来说,插入到数组的最后一个节点然后和父节点比大小,如果节点比父节点大,则节点交换,直到父节点大于等于该节点或一直到根节点。时间复杂度O(LogN)。
删除:
把跟节点即下标为1的节点和最后一个节点交换,然后删除最后一个节点。然后一次拿根节点和其字节点比较直到满足要求为止。
堆化:
一个一个堆化:
先在数组中插入第一个元素,然后依次调用向堆中插入节点的操作。所以时间复杂度为log1+log2+…+logN = log(!N)近似等于NlogN,效率低下。
一次性堆化:
根据树的结构,我们可以找到最后一个含有子节点的父节点,然后用父节点和其字节点比较大小,不满足条件就交换节点位置,满足条件就遍历前面的父节点。因为最后一个父节点的坐标可以根据完全二叉树的特性得知为n/2,所以时间复杂度为O(N).
堆排序:
是一个持续删除堆顶然后堆化的过程,因为堆顶元素始终是最大的或最小的。每次删除一个元素就得堆化依次,一共要删除n个元素,所以时间复杂度为O(NlogN)。
因为每次删除都要交换节点(根节点和尾节点交换),可能会打乱两个值相同的先后顺序,所以是不稳定的排序。