【数据结构】堆、堆排序笔记

【数据结构】堆、堆排序笔记

  • 堆是一棵完全二叉树,树的每个结点的值都不小于(或者不大于)其左右孩子的值。
  • 父亲结点大于等于孩子结点的值叫做大顶堆,反之叫做小顶堆
  • 大顶堆的每个结点的值都是以它为根结点的子树的最大值,反之最小值
  • 下面都以大顶堆为例子:
  • 两个兄弟之间不存在大小比较关系,堆只能说明某结点引导的子树的所有子结点都比它小,就像领导关系一样,下属之间或者领导之间可能有实力高低,但是领导是他的所有下属的最高级
  • 建堆:把所有非叶子结点都向下调整(从n/2开始直到1)
  • 向下调整:(不断和自己的左右孩子比较,把孩子的最大值和自己交换,直到结点的下标大于最后一个元素的数组下标high为止。记住:i结点的左孩子j结点满足j = i * 2;)
  • 删除堆顶元素(用最后一个元素覆盖堆顶元素,然后让n- -,然后向下调整)
  • 增加一个元素(添加到最后一个结点的后面,然后进行向上调整操作)
  • 向上调整操作就是把将要调整的结点与父亲结点比较,如果权值比父亲结点大,那么就交换其与父亲结点,这样反复比较,直到到达堆顶或者是父亲结点的权值比较大为止
  • 堆排序:
    • 在建堆完毕后,堆排序就是取出堆顶元素,然后将堆的最后一个元素i替换至堆顶,再进行一次针对堆顶元素1向下调整(1, i – 1)范围,直到堆中只有一个元素为止(i == 2)