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)
1∑n−1lgk=Θ(nlgn)
在降序排列中类似,只是在建立大根堆的时候要快一些,然而堆排序的复杂度主要是由每次维护最大堆的性质的时间决定的,所以时间复杂度仍然是
Θ
(
n
l
g
n
)
\Theta(nlgn)
Θ(nlgn).
6.4-4
最坏的情况就是6.4-3中所有数据按升序排列的情况,证明方法同上。