6.1 堆
堆是一种完全二叉树,因此可以用数组A来表示。树的根为A[1],给定了某个结点的下标i,其父结点PARENT(i)、左儿子LEFT(i)、右儿子RIGHT(i)的下标可以简单地计算出来:
PARENT(i)
return i/2
LEFT(i)
return 2i
RIGHT(i)
return 2i+1
二叉堆有两种:最大堆和最小堆。在这两种堆中,结点内的数值都要满足heap property。在最大堆中,max-heap property是指除了根结点以外的每个结点i,有
A[PARENT(i)] >= A[i]
在最小堆中,min-heap property是指除了根结点以外的每个结点i,有
A[PARENT(i)] <= A[i]
6.2 保持堆的性质
MAX-HEAPIFY是对最大堆进行操作的重要子程序。其输入为一个数组A和下标i。当MAX-HEAPIFY被调用时,我们假定以LEFT(i)和RIGHT(i)为根的两棵二叉树都是最大堆,但这时A[i]可能小于其子女,这样就违反了max-heap property。MAX_HEAPIFY让A[i]在最大堆中“下降”,使以i为根的子树成为最大堆。
当MAX-HEAPIFY作用在一棵以结点i为根的,大小为n的子树上时,其时间复杂度为O(lgn)。
6.3 建堆
我们可以自底向上地用MAX-HEAPIFY来将一个数组A[1..n]变成一个最大堆。
BUILD-MAX-HEAP的时间复杂度是O(n)。
6.4 堆排序算法
HEAPSORT的时间复杂度为O(nlgn)。其中 BUIDL-MAX-HEAP的时间为O(n), n-1次HEAP-MAX-HEAPIFY调用中每一次的时间代价为O(lgn)。
6.5 优先级队列
时间为0(1)
时间复杂度为O(lgn)。
时间复杂度为O(lgn)
时间复杂度为O(lgn)
堆排序C实现: