7-1
a.
(1) 初始时,x=A[1]=13,i=0,j=13;
(2) 令j=j−1=12,A[12]>x,故继续令j=j−1=11,A[11]<x;令i=i+1=1,A[1]≥x。交换A[1]和A[11]得到A1={6,19,9,5,12,8,7,4,11,2,13,21};
(3) 令j=j−1=11,A[11]<x;令i=i+1=2,A[2]>x。交换A[2]和A[11]得到A2={6,2,9,5,12,8,7,4,11,19,13,21};
(4) 令j=j−1=9,A[9]<x;接下来令i=3到9,都有A[i]≤x,直到i=10,A[i]=19>x。此时i>j,故可以直接返回j=9,得到的序列为A2={6,2,9,5,12,8,7,4,11,19,13,21}。
b.
- 如果子数组以升序互不相同的元素排列,那么将重复j=j−1直到j=1,然后将进行一次i=i+1=1,然后就会直接返回j=1,j最小只能访问到
A[1] ,不会访问子数组以外的数; - 无论如何首先j肯定至少进行一次
j=j−1=r=12 ,然后因为x=A[p],所以第一次i=i+1=p,然后就得停止。交换A[j]和A[i]之后i<j,所以至少还得进行一次j=j−1,所以j最大只能取到r-1$。 - 因为至少会进行一次i=i+1,所以i最小只能访问
A[p] ;而且因为A[j..r]之间每个元素都大于等于x,所以重复i=i+1 时,最多只能使i=j+1,所以i最大只能访问到A[r] 不会超出子数组A[p..r]的范围。
c.
根据上面b小问的分析即可得知。
d.
从算法第5行到第7行知,每次循环中A[j+1..r]≥x,从第8行到第10行可知,A[p...j]≤x。每次循环中,若i<j,则交换A[i]与A[j],然后继续j的递减和
e.
QUICKSORT(A,p,r)
1 if p < r
2 q = HOARE-PARTITION(A,p,r)
3 QUICKSORT(A,p,q)
4 QUICKSORT(A,q+1,r)
7-2
a.
此时算法的随机性完全没有影响,算法的时间复杂度为O(n2)。
b.
PARTITION_1(A,p,r)
1 x = A[r]
2 i = p
3 t = r
4 j = p
5 while j <= t
6 if A[j] > x
7 exchange A[j] with A[t]
8 t = t - 1
9 else if A[j] < x
10 exchange A[i] with A[j]
11 i = i + 1
12 j = j + 1
13 else j = j + 1
14 return i and j
c.
RANDOMIZED-PARTITION_1(A, p, r)
1 i = RANDOM(p, r)
2 exchange A[r] with A[i]
3 return PARTITION_1(A, p, r)
RANDOMIZED-QUICKSORT(A, p, r)
1 if p < r
2 int[] q = RANDOMIZED-PARTITION_1(A, p, r)
3 if q[1] == p and q[2] = r
4 return
5 RANDOMIZED-PARTITION_1(A, p, q[1] - 1)
6 RANDOMIZED-PARTITION_1(A, q[2] + 1, r)
d.
直接将Zij={zi,zi+1,⋯,zj}中zi定义为数组A中第i小的元素中的一个,则
后面的分析是一样的。
7-3
a.
P(Xi)=1n,所以E[Xi]=P(Xi)=1n
b.
首先PARTITION过程的运行时间为Θ(n),然后当主元为第i小的元素时,问题被分为规模分别为
c.
d.
e.
假设对于某个正常数a和足够大的
最后一步去适当的a使得
7-4
a.
算法前面和快速排序是一样的,调用PARTITION后,递归调用了左边的子数组;然后通过将p=q+1,并经过循环,对右边的子数组进行了快速排序操作,与递归调用快速排序是一样的,所以能正确的对数组A进行排序。
b.
当数组本身就是按升序排列的,那么每次PARTITION操作后,左边的数组大小都只比原先的小一,所以一共会递归调用n次,即栈深度为
c.
TAIL-RECURSIVE-QUICKSORT(A, p, r)
1 while p < r
2 q = PARTITION(A, p, r)
3 if q <= (r+p)/2
4 TAIL-RECUISIVE-QUICKSORT(A, p, q-1)
5 p = q + 1
6 else
7 TAIL-RECURSIVE-QUICKSORT(A, q + 1, r)
8 r = q
7-5
a.
b.
当n→∞时,上式等于32,所以增加了1/2倍。
c.
三数取中法的好划分概率为
平凡实现为
当n→∞时,
增加了4/9倍。
d.
不知道。。。
7-6
不会。。。