第六章 堆排序

堆排序时间复杂度: O ( n lg ⁡ n ) O(n\lg n) O(nlgn),和归并排序一样

一个近似完全的二叉树

image-20210324140441665

  • 根节点A[1]
  • A[i]的父节点A[ ⌊ i / 2 ⌋ \lfloor i/2 \rfloor i/2]
  • A[i]左子节点A[2i]
  • A[i]右子节点A[2i+1]

最大堆:子节点小于等于父节点,根节点最大,用于堆排序

(一个叶子节点本身是一个最大堆)

最小堆:子节点大于等于父节点,根节点最小,用于构造优先级队列

n个节点的堆的高度 ⌊ lg ⁡ n ⌋ \lfloor \lg n \rfloor lgn

维护堆的性质

最大堆

MAX-HEAPIFY(A,i) // Sub-tree rooted at node i
	l = LEFT(i)
	r = RIGHT(i)
	if l < heap-size[A] and A[l] > A[i]
		then largest = l
		else largest = i
    if r <= heap-size[A] and A[r] > A[largest]
    	then largest = r
    if largest != i
    	then exchange A[i] and A[largest]
    		MAX-HEAPIFY(A,largest)

建堆

BUILD-MAX-HEAP(A)
 heap-size[A] = length[A]
 for i = length[A]/2 downto 1
  do MAX-HEAPIFY(A,i)

时间代价 O ( n lg ⁡ n ) O(n\lg n) O(nlgn)

堆排序算法

HEAPSORT(A)
	BUILD-MAX-HEAP(A)
	for i = length[A] downto 2
		do exchange A[1] and A[i]
			heap-size[A] = heap-size[A] - 1
			MAX-HEAPIFY(A,1)

时间代价 O ( n lg ⁡ n ) O(n\lg n) O(nlgn)

优先级队列

一种用来维护一组元素构成的集合S的数据结构,其中每个元素有一个关键字key。

支持的操作:

  • INSERT(S, x),把元素x插入集合S中
  • MAXINUM(S),返回S中具有最大键字的元素
  • EXTRACT-MAX(S),去掉并返回S中具有最大键字的元素
  • INCREASE-KEYS(S, x, k),将元素x的关键字增加到k(比原来大)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值