特别说明,这里的序列都是从1开始。
1、什么是堆
对于n个元素的序列{R1, … , Rn}当且仅当满足下列关系之一时,称之为堆:
(1) Ri <= R2i+1 且 Ri <= R2i+2 (小根堆)
(2) Ri >= R2i+1 且 Ri >= R2i+2 (大根堆)
2、什么是堆排序
堆排序是一种树形选择排序,它的特点是在排序的过程中,将r[1..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在联系,在当前无序区中选择关键字最大或者最小的记录。
堆实际上是一棵以顺序方式存储的完全二叉树,并满足如下性质:树中任一非叶子结点的关键字均不大于或者不小于其左右孩子的关键字。例如关键字序列(12, 36, 24, 85, 47, 30, 53, 91)和(96, 83, 27, 28, 11, 09)分别是满足上述性质的小根堆和大根堆。第一个序列对应的二叉树如下图:
显然,堆中任一子树也是堆。
3、推排序的基本操作
堆排序利用了大根堆(或小根堆)中堆顶记录的关键字最大(或最小),这一特性,使得在当前无序区中选取最大(最小)的记录变得简单。下面以大根堆为例说明堆排序的基本过程。
大根堆排序算法的基本操作,初始化操作是按堆的定义将数组R[1..n]调整为初始堆。每一趟排序的基本操作是,将当前无序区的堆顶记录r[1]和该区