【数据结构与算法之美】堆和堆排序

什么是堆

  1. 堆是一个完全二叉树

tips:完全二叉树的特征是除最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列

  1. 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
  • 大顶堆
  • 小顶堆

如何实现一个堆

  1. 如何存储一个堆

数组存储,.....数组存储的优势?

  1. 堆支持哪些操作?
    2.1 往堆里插入一个元素
    插入元素后,需继续满足堆的两个特性,这其中就有个堆化(heapify)的过程
    堆化方向:从下往上、从上往下
    堆化过程:顺着节点所在的路径,从下或者从上,对比,然后交互
    2.2 删除堆顶元素

往堆中插入一个元素和删除堆顶元素的时间复杂度都是O(log n)

如何基于堆实现排序?

堆排序,时间复杂度O(n log n),原地排序算法

  1. 建堆
    从后往前处理数组,每个数据都是从上往下堆化,建堆的时间复杂度O(n)
  2. 排序
    移除堆顶元素,把下标为n的元素放堆顶,再通过堆化的方法,将剩下的n-1个元素重新构建成堆。
    堆排序的时间复杂度是O(n log n)

为什么快速排序要比堆排序性能好?

  1. 堆排序数据访问的方式没有快速排序友好
  2. 同样数据,排序过程中,堆排序算法的数据交换次数要多于快速排序
posted @ 2020-09-15 09:32  zendwang  阅读(242)  评论(0编辑  收藏  举报