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

6.1 堆

堆是一种完全二叉树,因此可以用数组A来表示。树的根为A[1],给定了某个结点的下标i,其父结点PARENT(i)、左儿子LEFT(i)、右儿子RIGHT(i)的下标可以简单地计算出来:

PARENT(i)

return i/2

LEFT(i)

return 2i

RIGHT(i)

return 2i+1

二叉堆有两种:最大堆和最小堆。在这两种堆中,结点内的数值都要满足heap property。在最大堆中,max-heap property是指除了根结点以外的每个结点i,有

A[PARENT(i)] >= A[i]

在最小堆中,min-heap property是指除了根结点以外的每个结点i,有

A[PARENT(i)] <= A[i]

 

 

 

 

 

6.2 保持堆的性质

MAX-HEAPIFY是对最大堆进行操作的重要子程序。其输入为一个数组A和下标i。当MAX-HEAPIFY被调用时,我们假定以LEFT(i)和RIGHT(i)为根的两棵二叉树都是最大堆,但这时A[i]可能小于其子女,这样就违反了max-heap property。MAX_HEAPIFY让A[i]在最大堆中“下降”,使以i为根的子树成为最大堆。

 

当MAX-HEAPIFY作用在一棵以结点i为根的,大小为n的子树上时,其时间复杂度为O(lgn)。

 

 

 

 

 

6.3 建堆

我们可以自底向上地用MAX-HEAPIFY来将一个数组A[1..n]变成一个最大堆。

BUILD-MAX-HEAP的时间复杂度是O(n)。

 

 

 

 

 

6.4 堆排序算法

HEAPSORT的时间复杂度为O(nlgn)。其中 BUIDL-MAX-HEAP的时间为O(n), n-1次HEAP-MAX-HEAPIFY调用中每一次的时间代价为O(lgn)。

 

 


6.5 优先级队列

时间为0(1)

 

 

 

 

 

时间复杂度为O(lgn)。

 

 

 

 

时间复杂度为O(lgn)

 

 

 

 

时间复杂度为O(lgn)

 

 

 

 

 

堆排序C实现:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值