• 粗略的理解了下,这个需要配合完全二叉树进行理解
  • 世人皆知,二叉树,每层个数呈现指数递增,第一层 1 第二层 2 第三层 4 第四层 8...
  • 将完全二叉树按层存入数组中,则是堆的原始形态,但此时并不符合堆的定义
  • ==关于数组位置和二叉树中的元素映射:数组地址位取 i=1,2,3,4....==
  • {
  • i 的父节点:i/2
  • i 的左孩子节点:2i
  • i 的右孩子节点: 2i+1
  • }
  • 堆分为
  • 大根堆
  • 数组在完全二叉树中,需要找到所有的非终端节点,进行遍历
  • 实际上也很简单,只需要找到最后一个非终端节点即可,也就是数组长度的一半处,即是最后一个非终端节点
  • 在此处进行倒序遍历,直到遍历到首部
  • 每次遍历都需要保证该非终端节点的左右子节点均小于自己,如果不是,则选取最大的子节点进行交换
  • 每次遍历完成交换完成后,若是出现新的冲突则按照惯例继续交换,直到符合原则
  • 最后,这便是大根堆
  • 小根堆
  • 小根堆和大根堆的原理类似,原则变成左右节点均大于自己
  • 上述建堆过程的时间复杂度为O(n)

    计算量微大记住结论即可

    #堆的删除和插入

  • 以大根堆为例子
  • 删除堆顶元素,则末尾元素进入堆顶,然后再进行大根堆建立
  • 插入元素,将元素插入末尾,然后进行大根堆建立,记住是从下往上扫描