目录
我们上一篇文章讲解了向上调整建堆和向下调整建堆是什么,这一篇文章我们就仔细分析一下这两个建堆方式到底哪个比较好。
堆排序的时间复杂度分析
堆排序分为满二叉树和完全二叉树,下图是满二叉树,左边表示的是这一层的节点数,最后一排是2^(h-1)个节点,所以我们可以列出一个函数来
表示吗二叉树的节点个数,这个我们到后面一起写。还有一个就是完全二叉树,这个没有固定的节点个数,所以,我们讨论他的范围,最大值和最小值,最大值时是满二叉树时,最小值是最后一排只有一个节点时,这些都是很显而易见的,好,我们设树的高度为h,这时我们可以分别列出完全二叉树的节点个数了。
好的,我们假设树的节点个数是N,那么我们可以用h将N表示出来 ,也可以用N将h表示出来,
如图所示,如果我们要插入一个节点,假如是最坏的那一种情况,比如从最后一层要调整到堆顶,那么,就要调整logN次,所以这个复杂度是logN级的。
铺垫做好了,我们开始讲解重头戏吧。
向下调整建堆
假如这个堆我们要将他调整成小堆,那么我们要从第一排非叶子节点开始向下调整,h-1排要调整1次,h-2排要调整2次,以此类推
就可以得到这样一个等差数列 * 一个等比数列,运用我们高中的知识,就是错位相减法,就可以得到 T(h)的 通项公式,然后将我们上面求得的h和N的关系式带入到上面,就可以得到T(N)的通项公式了,那么向下调整建堆的时间复杂度就是O(N - logN)
向上调整建堆
其实和向下调整建堆差不多,也是一样的分析方式,列出通项公式,然后求得时间复杂度,这里就不过多赘述了。
好,我们得到了两个建堆方式的时间复杂度,这时,我们就能分析那个效率更高了,
很显然,向下调整建堆的效率更高。
向下调整建堆和向上调整建堆的特点
前者的特点就是:节点数越多的层,调整次数越少;
节点数越少的层,调整次数越多;
后者的特点就是:节点数越多的层,调整次数越多;
节点数越少的层,调整次数越少;
但是最后一排的节点数量占比整个节点的二分之一,自然向下调整建堆的算法效率最高。