HeapSort 堆排序

堆排序 - Heap Sort, 它和Merge Sort - 归并排序很像,但是不同于Insertion Sort - 插入排序,因为它的运行时间为 O(nlogn). 可是它又和Insertion Sort很类似,但是不同于Merge Sort, 因为它是In Place的。

综上所述,heap sort是整合了insertion sort 和 merge sort的优点的算法即 In Place的运行时间为 O(nlogn) 的排序算法。


1. 使用的数据结构

     heap sort使用的是数组数据结构进行操作,但是为了更好的理解我们将数据转化成二叉树 。如下图


2. 两种不同属性的heap sort, 一种是max-heap 如上图,任意根节点的值都大于它的左孩子和右孩子。另一种是min-heap, 任意根节点的值都小于它的左孩子和右孩子。


3. 如何保持heap sort中heap的max-heap或者min-heap的这种属性呢?

 (以max-heap作为例子)采用 max-heapify 操作。如下图,

 

4. max-heapify 是什么原理呢? 

 max-heapify 是一个方法, 这个方法的输入是两个变量 max-heapify(int[] array, int index). 做的就是一件事即 从输入的index开始使从该index为起点的较大值的子树满足max-heap属性。

如上图中, 对应的输入为 max-heapify (Array, 1). 就是从 节点 4开始, 使节点4以及它的子树满足max-heap属性。


5. 为什么要使用max-heapify?

 max-heapify是为build-max-heap做准备的,因为max-heapify只是对二叉树的中单个点进行操作使其满足max-heap属性,而build-max-heapify就是对整体的树进行max-heapify使整体满足max-heap属性。 注意的是当我们进行build-max-heapify的时候,我们不必从最后一个节点开始, 我们可以从中间节点开始, 因为中间节点之后的节点都是中间节点之前节点的孩子。 

6. build-max-heapify 会有什么好处?

  当在5中我们完成了build-max-heapify之后, 我们得出一个二叉树,该二叉树有一个很重要的性质:第一个节点是最大值!并且二叉树中的所有节点满足max-heap原则, 而且最后一个节点也肯定是一个较小值. 我们可以使用这些性质完成 heap sort 算法 即 每次把第一个节点和最后一个节点进行互换,互换之后对第一个节点进行max-heapify处理.  如下图

            

7. HeapSort算法的应用

  PriorityQueue 就是一个对heap sort 的很好的实现。

代码使用Java 实现: GitHub - HeapSort  (算法实现中的heap_size 指的是: 我们想要做操作的对应的数组大小!)


有问题欢迎指出!


猜你喜欢

转载自blog.csdn.net/ytdxyhz/article/details/53106908