概述
堆排序(heapsort)具有空间原址性,任何时候只需要常数个额外的元素空间存储临时数据。整个算法的时间复杂度是O(nlgn)。
堆性质
1)近似的完全二叉树
2)
PARENT(i)
return floor(i/2)
LEFT(i)
return 2i
RIGHT(i)
return 2i+1
3)最大堆 A[PARENT(i)] >= A[i]
4)最小堆 A[PARENT(i)] <= A[i]
堆应用
- 最大堆常用于构造优先队列
堆的几个基本操作
- MAX-HEAPIFY 时间复杂度O(lgn),维护最大堆性质函数
- BUILD-MAX-HEAP 线性时间复杂度 将源数组数据最大堆化
- HEAPSORT 时间复杂度O(nlgn),对原数组进行原址排序
- MAX-HEAP-INSERT 时间复杂度O(lgn)
- HEAP-EXTRACT-MAX 时间复杂度O(lgn)
- HEAP-INCREASE-KEY 时间复杂度O(lgn)
- HEAP-MAXIMUM 时间复杂度O(lgn)
堆性质维护
MAX-HEAPIFY的作用是保证i结点为根节点的子树遵循最大堆的性质。
伪代码如下:
MAX-HEAPIFY(A, i)
l = LEFT(i)
r = RIGHT(i)
if l <= A.heap-size and A[l] > A[i]
largest = l
else largest = i
if r <= A.heap-size and A[r] > A[largest]
largest = r
if largest != i
exchange A[i] with A[largest]
MAX-HEAPIFY(A, largest)
建堆
续。。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。