概述

堆排序(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)

建堆

续。。


Cruise_Chan
729 声望71 粉丝

技能树点歪了...咋办