堆排序

 

1. 堆

    (二叉)堆数据结构是一种数组对象,可以视为一颗完全二叉树。表示堆的数组A是一个具有两个属性的对象:length[A] 是数组中的元素个数, heap-size[A] 是存放在A中的堆的元素个数。树的根为A[1], 给定某个节点的下标i,

    PARENT(i)         return 「i/2」

    LEFT(i)               return 2i

    RIGHT(i)            return 2i + 1

    最大堆的特性是,指除了根以外的每个节点i, 有  A[PARENT(i)] ≥ A[i],最小堆与之相反。

 

2. MAX-HEAPIFY(A,i) 保持堆的性质

    输入:数组A和下标i                         目的:使以i为根的子树成为最大堆

    MAX-HEAPIFY(A,i)

    1    l <-- LEFT(i)

    2    r <-- RIGHT(i)

    3    if l ≤ heap-size[A] and A[l] > A[i]

    4           then largest <-- l

    5           else largest <-- i

    6    if r ≤ heap-size[A] and A[r] > A[largest]

    7           then largest <--r

    8    if largest ≠ i

    9          then exchange A[i] <--> A[largest]

    10               MAX-HEAPIFY (A, largest)

 

3. 建堆

    自底向上地用MAX-HEAPIFY来将一个数组[1 .. n] (此处n = length[A]) 变成一个最大堆。 证明可知 子数组A[( PARENT(n) + 1) .. n] 中的元素都是树中的叶子, 因此每个都可看做是只含一个元素的堆,故:

    BUILD-MAX-HEAP(A)

    1   heap-size(A) <-- length[A]

    2   for i <-- 「length[A] /2」+ 1 downto 1

    3           do MAX-HEAPIFY(A, i)

 

4. 堆排序算法

    HEAPSORT(A)

    1   BUILD-MAX-HEAP(A)

    2   for i <-- length[A] downto 2

    3           do exchange A[1] <--> A[i]

    4                  heap-size[A] <-- heap-size[A] -1

    5                  MAX-HEAPIFY(A, 1)

 

5. 优先级队列

    最大优先级队列支持的操作及实现:

    INSERT(S, x):把元素x插入集合S ;

    MAXIMUM(S):返回S中具有最大关键字的元素 ;

    EXTRACT-MAX(S):去掉并返回S中的具有最大关键字的元素 ;

    INCREASE-KEY(S, x, k):将元素x的关键字的值增加到k,这里k值不能小于原关键字的值。

 

    HAEP-MAXIMUM(A)

    1   return  A[1]

 

    HEAP-EXTRACT-MAX(A)

    1   if heap-size[A] < 1

    2      then error "heap underflow"

    3   max <-- A[1]

    4   A[1] <-- A[heap-size[A]]

    5   heap-size[A] <-- heap-size[A] -1

    6   MAX-HEAPIFY(A, 1)

    7   return max

 

    HEAP-INCREASE-KEY(A, i, key)

    1   if key < A[i]

    2      then error "new key is smaller than current key"

    3   A[i] <-- key

    4   while i>1 and A[parent(i)] < A[i]

    5      do exchange A[i] <--> A[parent(i)]

    6            i <-- parent(i)

 

    MAX-HEAP-INSERT(A,key)

    1   heap-size[A] <-- heap-size[A] + 1

    2   A[heap-size[A]] <-- -∞

    3   HEAP-INCREASE-KEY(A, heap-size[A], key)

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值