说明:该系列博客整理自《算法导论(原书第二版)》,但更偏重于实用,所以晦涩偏理论的内容未整理,请见谅。另外本人能力有限,如有问题,恳请指正!
1、堆排序算法
开始时,堆排序算法先用 BUILD-MAX-HEAP 将输入数组 A [ 1 .. n ]建成一个最大堆,此时数组中最大元素在根 A [ 1 ],可以通过将它与 A [ n ]互换来达到最终正确的位置(说明:一个大根堆只能得到一个最大值);然后从堆中去掉节点n,即缩小 A.heap-seize ,可以很容易地将 A [ 1 .. n - 1 ]建成最大堆。不断的重复这一过程,堆的大小由 n - 1一直降到2。
HEAP-SORT(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)
HEAP-SORT 过程的时间代价为 O ( n lg n )。其中调用 BUILD-MAX-HEAP 的时间为 O ( n ), n - 1次 MAX-HEAPIFY 调用中每次的时间代价为 O (lg n )。
2、堆结构和堆排序算法的简单Java实现
3、参考
具体详情请参考堆排序算法,但是该博客的代码有点啰嗦,代码可以参考堆排序原理与实现,比较简洁。图解排序算法之堆排序中的代码实现也可以参考一下,它比着上一个网址中的代码优化的地方在于可以减少几次赋值操作。