- 堆的概念
堆是一种特殊的树结构,通常将按照一定顺序排列好的树结构称之为堆。
百度百科中的介绍如下:
堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
堆总是满足下列性质:
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
常见的堆有二叉堆、斐波那契堆等。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)
若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,
则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。
若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。
1、堆的数组化
按照树的广度优先顺序进行排列,得到一个一维数组 A[n].
下标为i的节点对应的父节点为 A[(i-1)/2] ,对应左右子节点分别为 A[(i*2)+1]、A[(i*2)+2]。
2、堆节点的插入
插入到数组的最后一项,然后和其父节点进行比较,并做出相应的交换。同时更新整个堆的排序。
3、对节点的删除
总是删除根节点,并将数组的最后一个元素替换根节点,此时同步更新整个堆的排序。
4、堆排序
对于构造完成的最小堆数组,不断取出根节点后删除根节点,直到数组中没有其他元素。取出的数的序列即为排好序的序列。
5、堆排序的时间复杂度:O(N*logN)
更多信息请查看本人的个人网站:http://andersonlu.github.io/ProgrammingSky/