数据结构—堆排序及其应用(优先级队列)

一、时间复杂度
O(nlgn),原地排序算法(需要的额外存储空间为常数);

二、堆
1.堆的性质
(1)大顶堆:除了根节点之外的每个节点满足:A[parent(i)]>=A[i](最大元素在根节点)
(2)小顶堆:除了根节点之外的每个节点满足:A[parent(i)]<=A[i](最小元素在根节点)

2.堆排序基本过程
(1)MAX-HEAPIFY
  • 输入数组A和下标i,设LEFT(i)和RIGHT(i)均为大顶堆,调整A[i],使其成为大顶堆;
  • 时间复杂度为O(lgn),高度为n的节点的运行时间复杂度为O(h)
(2)BUILD-MAX-HEAP
  • 自底向上调用MAX-HEAPIFY建立最大堆,由于[n/2+1,n]元素均为叶子节点,因此只需要调整[n/2,0]元素;
  • 时间复杂度为O(n)
(3)HEAPSORT
  • 一次调用BUILD-MAX-HEAP,n-1次调用MAX-HEAPIFY(A, 1)(注:heap_size是不断递减的)
  • 时间复杂度为O(nlgn)
3.优先级队列操作(堆可以在O(lgn)时间复杂度上支持大小为n集合上的任意优先级队列操作)
优先级队列是一种用来维护由一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key,最大优先级队列支持的操作如下:
(1)MAX-HEAP-INSERT(S,x)
  • 将元素x插入到集合S;
  • ①加入一个关键字值为负无穷大的叶节点来扩充最大堆;②调用HEAP-INCREASE-KEY来设置新节点关键字的正确值,并保持最大堆性质;
  • 时间复杂度为O(lgn)
(2)HEAP-EXTRACT-MAX(S)
  • 去掉并返回S中具有最大关键字的元素
  • 时间复杂度为O(lgn)
(3)HEAP-INCREASE-KEY(S,x,k)
  • 将元素x的关键字的值增加到k,这里k值不能小于x的原关键字的值;
  • A[i]不断和A[parent(i)]比较、交换,直到A[i]<=A[parent(i)]
  • 时间复杂度为O(lgn)
(4)HEAP-MAXIMUM(S)
  • 返回S中具有最大关键字的元素;return S[1];
  • 时间复杂度为O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值