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