7.1-1
(a) 首先x=A[12]=11,i=0,j=1,此时我们比较A[1]和x可知A[1]>x,故令j=j+1=2;
(b) 然后比较A[2]和x可知A[2]>x,故继续令j=j+1=3;
(c) 比较A[3]和x可知A[3]<x,故令i=i+1=1,并交换A[i]即A[1]和A[3]得到新数组A1=9,19,13,5,12,8,7,4,21,2,6,11};
(d) 重复上述过程,最后得到序列A2={9,5,8,7,4,2,6,12,21,13,19,11},此时i=7,j=11,交换A[i+1]即A[8]和A[12],最终得到A3={9,5,8,7,4,2,6,11,12,21,13,19},并返回i+1=8。
7.1-2
返回的q=r;
在算法中加入一个计数器即可:
PARTITION_1(A,p,r)
1 x = A[r]
2 i = p - 1
3 count = 0
4 for j = p to r - 1
5 if A[j]<= x
6 if A[i] == x
7 count = count + 1
8 i = i + 1
9 exchange A[i] with A[j]
10 if count == r - p + 1
11 return \lfloor (p + r)/2 \rfloor
12 exchange A[i + 1] with A[r]
13 return i + 1
7.1-3
在规模为n的子数组运行PARTITION需要进行
7.1-4
将PARTITION算法的第4行换为A[j]≥x即可。