堆与堆排序
堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
- 堆中某个节点的值总是不大于或不小于其父节点的值
- 堆总是一棵完全二叉树
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。本篇博文我们来使用JavaScript来构建一个堆,并实现堆排序。
一、最大堆
根节点大于等于其叶子节点的堆被称为最大堆。虽然堆是一个树形结构,但是考虑到它是一个完全二叉树,有一个经典的实现就是使用数组来模拟。
1 | /** |
二、最小堆
根节点小于等于其叶子节点的堆被称为最大堆。
1 | /** |
三、堆排序
堆排序就是使用了堆这种数据结构的思想,来优化排序速度的。
1 | // 使用上面的最大堆的类来进行排序 |
对于以上堆排序的方法,我们是否可以考虑优化呢?答案当然是肯定的,在上面的堆排序算法中,我们额外使用一个空间为n的辅助堆,往这个堆中插入以及取出数据的时间复杂度都是O(nlogn)。通过查阅资料和学习我们可以知道,我们在进行堆排序时,我们并不需要辅助空间,直接在原地构建一个heap即可,这个行为过程有一个专有的名称叫做Heapify。
1 | // 原地堆排序 |