第二部分--排序和顺序统计学-第6章--堆排序

说明:该系列博客整理自《算法导论(原书第二版)》,但更偏重于实用,所以晦涩偏理论的内容未整理,请见谅。另外本人能力有限,如有问题,恳请指正!

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实现

       参考算法导论读书笔记(5)

3、参考

    具体详情请参考堆排序算法,但是该博客的代码有点啰嗦,代码可以参考堆排序原理与实现,比较简洁。图解排序算法之堆排序中的代码实现也可以参考一下,它比着上一个网址中的代码优化的地方在于可以减少几次赋值操作。

你可能感兴趣的:(第二部分--排序和顺序统计学-第6章--堆排序)