1 引言
2 堆排序
大根堆,任意一节点的值小于子节点的值称为小根堆。一般来说,堆可以用一个一维数组表示。
2.1 基本操作
2.1.1 获取父、子节点
PARENT(i)
return i/2
LEFT(i)
return 2i
RIGHT(i)
return 2i+1
2.1.2 维护堆的性质
的子树都是大根堆的情况下,使以为根节点的子树遵循大根堆的性质;此操作的伪代码如下:
MAX-HEAPIFY(A,i)
i = LEFT(i) r = RIGHT(i) if l <= A.heap-size and A[l] > A[i] largest = l else largest = i if r <= A.heap-size and A[r] > A[largest] largest = r if largest != i exchange A[i] with A[largest] MAX-HEAPIFY(A,largest)
;那么MAX-HEAPIFY对于子树的时间代价最多为多少呢,可以用如下递归式表示:
其中代表着其余非递归的操作,代表子树递归调用的最大值,因为每个孩子节点的子树最多为(当最底层恰好半满的时候)。

如上图,就是一个半满的完全二叉树,假设节点的右子树节点个数为,那么左子树节点个数为,总节点个数为,左子树占总数的比例为:,当时,这个比例为。因此可以用表达式来刻画MAX-HEAPIFY操作的运行时间;根据主定理求解得到运行时间为,即高为的堆的运行时间为。
2.2 建堆
以上的都是也治节点。因此建堆过程BUILD-MAX-HEAP的伪代码如下:
BUILD-MAX-HEAP(A)
A.heap-size = A.length for i = A.length/2 downto 1 MAX-HEAPIFY(A,i)
由上述伪代码中,每次调用MAX-HEAPIFY的时间为,总共调用次,因此可以估算建堆的运行时间为,但是很明显,这个上界不够精确。
的堆最多包含个节点;
的节点上运行MAX-HEAPIFY的代价是,因此建堆(BUILD-MAX-HEAP)的总代价为:
其中有:(根据公式:);
因此有:
2.3 堆排序算法
HEAPSORT(A)
BUILD-MAX-HEAP(A) for i = A.length downto 2 exchange A[1] with A[i] A.heap-size = A.heap-size - 1 MAX-HEAPIFY(A, 1)
其中,BUILD-MAX-HEAP运行时间为,执行了次MAX-HEAPIFY,每次时间为,因此,堆排序的时间复杂度为。
文章来源: https://blog.csdn.net/fugitive1/article/details/92656373