(二叉)堆数据结构是一种数组对象,是一个完全的二叉树
二叉堆有两种:最大堆和最小堆
二叉树的层次遍历结果与数组元素的顺序对应,树根为A[1]。对于数组中第i个元素
PARENT(i)
return i/2
LEFT(i)
return 2i
RIGHT(i)
return 2i+1
涉及过程:
MAX-HEAPIFY过程,运行时间为O(lgN),加入A[i]小于其子节点,MAX-HEAPIFY会使A[i]下降,子节点上升,是保持最大堆性质的关键
BUILD-MAX-HEAP过程,以线性时间运行,在无序的输入数组基础上构造出最大堆
HEAPSORT过程,运行时间为O(nlgN),对一个数组原地进行排序
保持堆的性质
时间复杂度为:T(n) <= T(2/3n)+O(1)
伪代码:
MAX-HEAPIFY(A,i):
l<- LEFT(i)
r<- RIGHT(i)
//----在节点和左右子节点中得到最大数,heap-size[A]代表存放在数组A的堆长度
if l<=heap-size[A] and A[l] > A[i]
then largest <- l
else largest <- i
if r<=heap-size[A] and A[r] > A[largest]
then largest <- r
//----
//当前节点小于子节点就下降,并递归直到正确位置
if largest != i
then exchange A[i]<- A[largest]
MAX-HEAPIFY(A,largest)
建堆
建立最大堆的过程是自底向上地调用最大堆调整程序将一个数组A[1.....N]变成一个最大堆。将数组视为一颗完全二叉树,从其最后一个非叶子节点(n/2)开始调整。调整过程如下图所示:
时间复杂度为 O(n)
伪代码:
BUILD-MAX-HEAP(A):
heap-size[A] <- length[A]
for i<-length[A]/2 downto 1 (直到i=1结束,包括1)
MAX-HEAPIFY(A,i)
堆排序算法
堆排序算法过程为:先调用创建堆函数(BUILD-MAX-HEAP)将输入数组A[1...n]造成一个最大堆,使得最大的值存放在数组第一个位置A[1],然后用数组最后一个位置元素与第一个位置进行交换,并将堆的大小减少1,并调用最大堆调整函数从第一个位置调整最大堆。给出堆数组A={4,1,3,16,9,10,14,8,7}进行堆排序简单的过程如下:
时间复杂度为O(nlogn)
(1)创建最大堆,数组第一个元素最大,执行后结果下图:
(2)进行循环,从length(a)到2,并不断的调整最大堆,给出一个简单过程如下:
伪代码:
HEAPSORT(A):
BUILD-MAX-HEAP(A)
for i<-length[A] downto 2
do exchange A[1] <- A[i]
heap-size[A] <- heap-size[A] - 1
MAX-HEAPIFY(A,1)
链接
http://www.cnblogs.com/Anker/archive/2013/01/23/2873422.html