堆排序分为两个过程,一个建堆的过程,一个是从堆顶取数的过程。这里针对第一个过程,给出在堆的形式是完全满二叉树的情况下,建堆复杂度Ο(n)的简单推导。
上图是一个完全满二叉树,假设一个完全满二叉树的节点数为n,树高为h(共h层),则满足h = log(n + 1)。由堆的构建过程可以知道,第一层(从下往上)进行的比较次数为0次,第二层为1次,。。。,第h层(最上一层)为h - 1次,而每一层对应的节点数分别为2^h, 2^(h - 1), ..., 2^0个,所以总计的比较次数为
T(n) = 0 * 2^h + 1 * 2^(h - 1) + 2 * 2^(h - 2) + ... + (h - 1) * 2^0 式(1)
而
2T(n) = 1 * 2^h + 2 * 2^(h - 1) + 3 * 2^(h - 2)... + (h - 1) * 2^1 式(2)
式(2)减式(1)得
T(n) = 2^h + 2^(h - 1) + 2^(h - 2)... + 2^1 - (h - 1) 式(3)
所以
T(n) = 2^(h + 1) - h - 1 = 2n - log(n + 1) + 1 = O(n)
推到错误,纯属正常。