算法导论第二章 2.3

算法导论第二章

2.3 设计算法

3-1

  1. 首先传递数组A和范围下标 p = 1 p = 1 p=1 r = 8 r = 8 r=8(假设下标数组从1开始)到MERGE-SORT函数
  2. 判断 p p p是否小于 r r r,也就是判断数组 A A A中的元素个数,如果不满足 p p p小于 r r r,则数组中元素最大只有一个,也就不用排序
  3. 获取范围中间的下标,赋值给 q = 4 q = 4 q=4
  4. 接着递归调用第一个MERGE-SORT函数,传递数组A及其范围下标 p = 1 p = 1 p=1 q = 4 q = 4 q=4
  5. 如上一直递归到范围下标 p > = r p >= r p>=r,也就是只有一个元素 ( 3 ) (3) (3)的时候,什么都不干,然后退出当前次函数
  6. 接着返回到了范围下标 p < r p < r p<r的MERGE-SORT函数中,且有两个元素 ( 3 , 41 ) (3,41 ) (3,41),我们运行第二个MERGE-SORT函数,传递数组 A A A及其范围下标 q + 1 q + 1 q+1 r r r
  7. 因为传递的 q + 1 q + 1 q+1等于 r r r,也就是只有一个元素 ( 41 ) (41) (41),所以也什么都不干,退出当前次函数
  8. 回到了原先的MERGE-SORT函数,调用MERGE函数置排序当前范围的两个元素,然后退出当前次函数,来了范围为 4 4 4个元素的MERGE函数中。
  9. 如此递归,自底向上的排序推进,直到最终形成长度为r的排好序的序列

3-2

MERGE(A, p, q, r)
1   n1 = q - p + 1
2   n2 = r - q
3   let L[1..n1] and R[1..n2] be new array
4   for i = 1 to n1
5       L[i] = A[p + i - 1]
6   for j = 1 to n2
7       R[j] = A[q + j]
8   i = j = 1
9   for k = p to r
10      if j > n2 or (i <= n1 and L[i] <= R[j])
11          A[k] = L[i]
12          i = i + 1
13      else if i > n1 or R[i] < L[i]
14          A[k] = R[j]
15          j = j + 1

3-3

  算法导论2.3.3 标准答案

3-4
T ( n ) { Θ ( 1 ) i f   n = 1 T ( n − 1 ) + C ( n − 1 )      o t h e r w i s e T\left( n\right) \begin{cases}Θ\left( 1\right)\qquad\qquad\qquad\qquad\qquad if\ n = 1\\T\left( n-1\right) +C\left( n - 1\right)\qquad\ \ \ \ otherwise\end{cases} T(n){Θ(1)if n=1T(n1)+C(n1)    otherwise

where C ( n ) C(n) C(n) is the time to insert an element in a sorted array of n elements.(其中 C ( n ) C(n) C(n)是在 n n n个元素的排序数组中插入元素的时间。)

3-5

// A表示数组
// b表示第一个范围下标
// e表示第二个范围下标
// u表示需要查找得数据

BINARY-SEARCH(A, b, m, u)
1   if b >= e
2       return false
3   m = (b + e) / 2 + (b + e) % 2
4   if u > A[m]
5       BINARY-SEARCH(A, m, e, u)
6   else if u < A[m]
7       BINARY-SEARCH(A, b, m, u)
8   else
9       return A[m]

证明:
因为给定输入,例如 n n n,每次递归一次, n n n就去除一半 ( n / 2 ) (n / 2) (n/2),很明显就是 Θ ( l g n ) Θ(lgn) Θ(lgn)
我也不知道该咋证明了~ 但的确很明显就是 Θ ( l g n ) Θ(lgn) Θ(lgn)

3-6
不对,因为在插入排序中,还需要线性移动一些数据。

3-7
  算法导论2.3.6 标准答案

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值