堆排序使用最大堆,最小堆一般用于优先队列
堆特点
1.parent > children
2.完全二叉树
完全二叉树概念:从上往下,从左往右,结点依次添加
以下都是完全二叉树
parent 结点 > chidren 结点
如图 子结点都小于父结点
python 标准库 heapq 模块
提供基于堆得优先队列得支持
堆构建
堆排序的时间复杂度O(nlgn)
heapify O(lgn) :维护堆得性质
build_heap O(n) : 无序输入的数组构成一个最大堆
heap_sort O(nlgn)
heapify 函数作用 :比较父节点和 子结点,如果子节点大于父节点,交换,保证是个堆
如图,父结点 5 小于 10. heapify 作用 交换他们
构建堆过程
如果是全部打乱的树如何构建堆
从倒数第二层开始做heapify操作
如图所示:
堆排序
1.根结点跟最后一个结点交换位置,然后在去掉最后一个结点
2.交换后不再是堆,根结点做一下heapify 调整
3.第二次排序,重复上诉步骤
4.最后就按照从小到大的顺序排列了
堆排序实现