算法导论第三版习题7.1

7.1-1

(a) 首先x=A[12]=11,i=0,j=1,此时我们比较A[1]xA[1]>x,故令j=j+1=2
(b) 然后比较A[2]xA[2]>x,故继续令j=j+1=3
(c) 比较A[3]xA[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需要进行n1次比较,每次比较时间复杂度为Θ(1),所以整个算法的复杂度为Θ(n)

7.1-4

将PARTITION算法的第4行换为A[j]x即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值