概念
- 定义
- 完全二叉树
- 节点的值不小(大)于子节点的值
- 大顶堆,小顶堆
- 数组存储:数组存储完全二叉树节省内存
操作
- 插入
- 元素放到堆的最后
- 堆化(heapify): 从下往上或从上往下
- 删除
- 堆化:时间复杂度O(logn),和树高度成正比
- 堆排序
- 建堆: 时间复杂度:O(n)
- 思路一:插入的方式(从前往后处理数据,从下往上堆化)
- 思路二:从后往前处理数据,从上往下堆化( 从非叶节点开始堆化)
- 排序
- 第一个节点最大,放到最后,该节点排序完成
- 堆化剩余节点(已排序节点无需堆化)
- 重复该过程
- 原地排序
- 建堆时间复杂度O(n)
- 排序时间复杂度O(nlogn)
- 不稳定排序算法
- 堆排序和快排
- 堆排数据访问方式不友好(跳着访问,对CPU缓存不友好)
- 同样的数据,堆排序数据交互次数多余快排(建堆改变了有序度,打乱已有排序)
class Heap {
constructor() {
this.arr = ['']
}
setArr(arr) {
this.arr = ['', ...arr]
}
display() {
let {
arr } = this
arr = arr.slice(1)
let len = arr.length
let i = 0
let h = 1
let str = ''
while (i < len) {
let j = 0
while (j++ < h) {
if (arr[i] !== undefined) {
str += ' ' + arr[i]
i++
}