堆排序(3)

在之前,我们对堆进行了介绍,也对如何维护最大堆的性质,如何建立最大堆进行了叙述,那么,我们接下来的问题就是,我们如何进行堆排序?

初始时候,堆排序算法利用Build-Max-Heap将输入数组A[1……n]建成最大堆,其中n=A.length。

因为数组中最大元素总在根节点A[1]中,通过把它与A[n]的互换,我们可以让该元素到正确的位置,这时候,如果我们从堆中去掉结点n,剩余的结点中,原来根的法制结点仍然是最大堆,而新的结点很有可能违背最大堆的性质,为了维护最大堆的性质,我们需要做的就是调用Max-Heapify(A,1),从而在A[1……n-1]上构造一个新的最大堆,堆排序算法会不断重复这个过程,直到堆的大小从n-1降到2。

HeapSort(A)
1  Buid-Max-Heap(A)
2  for i=A.length downto 2
3   	exchange A[1] with A[i]
4   	A.heap-size=A.heap-size-1
5   	Max-Heapify(A,1)

接下来我们可以跟随这里给出的伪代码,将数组A进行堆排序。我们需要执行的操作有:

  1. 建成最大堆
  2. 去掉根节点
  3. 维护最大堆性质
  4. 重复步骤2、3,直到堆中元素依次有序排列
点赞