下面是建立大根堆的代码
template <typename Type>
void CreateBigRootHeap(Type *array, int len)
{
int i, j, k;
Type temp;
for (i = (len - 1) / 2; i >= 0; --i)
{
temp = array[i];
k = i;
for (j = i * 2 + 1; j < len; j = j * 2 + 1)
{
if (j < len - 1 && array[j] < array[j + 1])
j += 1;
if (temp > array[j])
break;
array[k] = array[j];
k = j;
}
array[k] = temp;
}
}
现在对建立堆时所使用的时间复杂度为O(n)进行证明:
令堆所对应的完全二叉树的高度为h,节点的个数为n,现假定完全二叉树为满二叉树:即n = 2^h - 1,如下图(借用网上的图)所示
有2^(h-2)个结点向下访问一次,2^(h-3)个结点向下访问2次,...1个结点向下访问h-1次(之前写错了,写成了h次,下面公式最后也应该是h-1, 因为好久了不好改了,抱歉):
推导公式如下:
在堆所对应的二叉树为非满二叉树时,复杂度是n同阶的。
Apr 16, 2013 @lab