最开始研究的是大顶堆,父亲节点的值会大于两个孩子节点的值,但是左孩子跟右孩子没有值之间的差异。
插入一个元素的时候,整个堆可能不满足堆的性质,所以要调整堆,调整算法如下:
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) |
插入一个元素的时候,整个堆可能不满足堆的性质,所以要调整堆,调整算法如下:
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)
堆排序的应用:优先级队列
堆排序算法并没有快速排序性能好,优先队列的应用有很多,在共享计算机调度当中,会从等待队列当中找到优先级最高的作业,从队列当中摘出来进行调度。
相关热门文章
给主人留下些什么吧!~~
评论热议