堆分为两类,最大堆和最小堆。最大堆就是根结点的元素最大,然后以从上到下从左往右数据递减,最小堆呢就恰恰相反。这里值得注意的是堆的两个特性:

    • 序号为x的结点,如果有父结点则其序号为floor( x / 2 )。floor表示不大于x的最大整数

    像下面这货,就是典型的最小堆:

    12. 数据结构之最大堆和最小堆 - 图1

    从图中可以观察到的是最大堆的任意一个结点的左右子树(只要存在)都比该结点要小,最小堆的任意一个结点的左右子树(只要存在)都比该结点要大。

    那么话说回来,“堆”这玩意到底有啥用?

    其实,最大的作用就是堆排序!堆排序是一种不稳定排序,平均时间复杂度为( nlogn ),其中logn是用于构建堆,n用于排序。这种数据结构本身在我们需要top k这种排序的时候会优势比较明显,非常屌,值得掌握。

    假如说我们有array( 50, 10, 90, 30, 70, 40, 80, 60, 20 ),然后需要将这个一维数组构建成最大堆,代码大概如下:

    实际上,有为青年可能已经研究到了,php的SPL中已经内置了Heap这种数据结构,我就贴个链接,你们感受一下: