算法导论-堆排序学习笔记

最开始研究的是大顶堆,父亲节点的值会大于两个孩子节点的值,但是左孩子跟右孩子没有值之间的差异。
插入一个元素的时候,整个堆可能不满足堆的性质,所以要调整堆,调整算法如下:
MAX_HEAPIFY(A,i)
l = Left(i)
r = Right(i)
if l < A.heap_size && A(l) > A(i)
    largest = l
else largest = i
if r < A.heap_size && A(r) > A(largest)
    largest = r
if largest != i
    swap(A(largest),A(i))
     MAX_HEAPIFY(A,largest)

T(n) = T(2n/3) + O(1)
根据主定理可以得知 调整堆的时间复杂度为O(lgn)

根据完全二叉树的性质,可以得知堆的所有的叶子节点的下标范围为n/2+1~n.所以建堆的算法如下
BUILD-MAX_HEAP(A)
A.heapsize= A.length
for i in n/2.....1
   MAX_HEAPIFY(A,i)

HEAP_SORT(A)
  BUILD-MAX_HEAP(A)
for i in A.length ...2
  swap(A[i],A[1])
  A.heapsize -= 1
 MAX_HEAPIFY(A,1)

堆排序的应用:优先级队列
 堆排序算法并没有快速排序性能好,优先队列的应用有很多,在共享计算机调度当中,会从等待队列当中找到优先级最高的作业,从队列当中摘出来进行调度。



阅读(48) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值