【数据结构系列】堆与堆排序

来源:互联网 发布:学java的条件 编辑:程序博客网 时间:2024/06/03 19:18

  • 堆的概念

     堆是一种特殊的树结构,通常将按照一定顺序排列好的树结构称之为堆。
     百度百科中的介绍如下:
         堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。
         堆总是满足下列性质:
          将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
  常见的堆有二叉堆、斐波那契堆等。
  堆的定义如下: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/

0 0
原创粉丝点击