在正常排序的二叉树中,有满二叉树与完全二叉树两种,他们之间相差X个结点。
如果我们要继续排序,就要用到大小堆的方法。
这里我问一个问题:要建立顺序数组,应该用到哪个堆呢?答案是大堆,而不是小堆!为什么?因为大堆可以把最大值找出来,赋值给新的数组后与最后一个值交换隐藏即可,第二次排序即次大。用小堆的话很难找到最大值,因为左孩子有孩子之间无法排序(按本题思路为前提)。
而排序的过程就是建堆,为什么建堆的复杂度是0(N)呢?现在我们来计算一下:
我们可以先想象一下最坏的情况,就是满二叉树,每一个结点,除了叶子,都可能进行一次建堆,为什么是一次?因为找出孩子与父亲之间谁大只需要一次。
假设h为深度,即层数,N为结点数,时间复杂度为 t(N) :
我们知道,一个满二叉树的结点数是:N = 2^h - 1 ,
所以 2^h - 1 - h 可以转换为 N - h , 而二叉树深度h的公式为 h = log N,2为底,
所以再转换为 N - logN,按时间复杂度的方式来算,省略掉 logN,
最终的时间复杂度为 O(N) ;
你学会了吗。