<算法导论>练习6.4

6.4-1
先把数组转化为最大堆,然后取出根节点,把剩余的节点数组再转化为最大堆,重复这个过程就是堆排序。
5,13,2,25,7,17,20,8,4
5,13,20,25,7,17,2,8,4
5,25,20,13,7,17,2,8,4
25,5,20,13,7,17,2,8,4
25,13,20,5,7,17,2,8,4
25,13,20,8,7,17,2,5,4
4,13,20,8,7,17,2,5,25
20,13,4,8,7,17,2,5,25
20,13,17,8,7,4,2,5,25
5,13,17,8,7,4,2,20,25
17,13,5,8,7,4,2,20,25
2,13,5,8,7,4,17,20,25
13,2,5,8,7,4,17,20,25
13,8,5,2,7,4,17,20,25
4,8,5,2,7,13,17,20,25
8,4,5,2,7,13,17,20,25
8,7,5,2,4,13,17,20,25
4,7,5,2,8,13,17,20,25
7,4,5,2,8,13,17,20,25
2,4,5,7,8,13,17,20,25
5,4,2,7,8,13,17,20,25
2,4,5,7,8,13,17,20,25
4,2,5,7,8,13,17,20,25
2,4,5,7,8,13,17,20,25

6.4-2
起始:子数组A[i+1…n]是空的,因此成立。
维持:A[1]是A[1,…i]中最大的元素,并且小于A[i+1,…n]中的所有元素,当将其与第i个元素交换,并把堆大小减一时,A[i,…n]仍是数组中最大已排序的元素。再维护最大堆的性质重复操作即可。、
结束:当i=1时,A[2,…n]已排序好,并且A[1]是最小的。

6.4-3
两种情况的时间复杂度都是 O ( n l g n ) O(nlgn) O(nlgn).
在升序排列中,算法需要O(n)的时间将其转换为大根堆,在堆排序中需要n-1次调用max-heapfiy算法维护最大堆的性质,每次需要lgk的复杂度,一共:
∑ 1 n − 1 l g k = Θ ( n l g n ) \sum_{1}^{n-1} lgk=\Theta(nlgn) 1n1lgk=Θ(nlgn)
在降序排列中类似,只是在建立大根堆的时候要快一些,然而堆排序的复杂度主要是由每次维护最大堆的性质的时间决定的,所以时间复杂度仍然是 Θ ( n l g n ) \Theta(nlgn) Θ(nlgn).

6.4-4
最坏的情况就是6.4-3中所有数据按升序排列的情况,证明方法同上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值