1
{3, 9, 26, 38, 41, 49, 52, 57}
{3, 26, 41, 52}
{9, 38, 49, 57}
{3, 41}
{26, 52}
{38, 57}
{9, 49}
{3}
{41}
{52}
{26}
{38}
{57}
{9}
{49}
2
merge(A, p, q, r)
m = q - q + 1
n = r - q
let L[1..m] and R[1..n] be new arrays
for i = 1 to m
L[i] = A[p + i - 1]
for j = 1 to n
L[j] = A[q + j]
i = j = k = 1
while i <= m and j <= n
if L[i] <= R [j]
A[k++] = L[i]
++i
else
A[k++] = L[j]
++j
while i <= m
A[k++] = L[i++]
while j <= n
A[k++] = L[j++]
3
对于
n
=
2
0
n = 2^0
n=20 ,
T
(
2
)
=
2
T(2)=2
T(2)=2,满足
T
(
n
)
=
n
lg
n
T(n)=n\lg n
T(n)=nlgn.
假设
n
=
2
k
n = 2^k
n=2k 满足
T
(
n
)
=
n
lg
n
T(n)=n\lg n
T(n)=nlgn,根据递归式,当
n
=
2
k
+
1
n = 2^{k+1}
n=2k+1时,
T
(
n
)
=
T
(
2
k
+
1
)
=
2
T
(
2
k
)
+
2
k
+
1
=
2
×
2
k
lg
2
k
+
2
k
+
1
=
2
k
+
1
lg
2
k
+
1
=
n
lg
n
\begin{aligned} T(n)&= T(2^{k+1}) \\ &= 2T(2^k)+2^{k+1} \\ &=2\times2^k\lg 2^k+2^{k+1} \\ &=2^{k+1}\lg2^{k+1} \\ &=n\lg n \end{aligned}
T(n)=T(2k+1)=2T(2k)+2k+1=2×2klg2k+2k+1=2k+1lg2k+1=nlgn
由数学归纳法,对于
n
=
2
k
,
k
≥
0
n = 2^k,k\geq0
n=2k,k≥0,
T
(
n
)
=
n
lg
n
T(n)=n\lg n
T(n)=nlgn成立。
4
T ( n ) = { Θ ( 1 ) i f n = 1 T ( n − 1 ) + Θ ( n ) i f n > 1 T(n)=\left\{ \begin{array}{lcl} \Theta(1)& &{\rm if}\ n=1\\ T(n-1)+\Theta(n)& &{\rm if}\ n>1 \end{array} \right. T(n)={Θ(1)T(n−1)+Θ(n)if n=1if n>1
5
binarySearch(A, n, x)
left = 1
reight = n
while left < right
mid = (left + right) / 2
if A[mid] == x
return mid
else if A[mid] > x
right = mid - 1
else if A[mid] < x
left = mid + 1
return NIL
6
不能。尽管使用二分搜索可以更快地找到插入位置,但是由于数组本身的特性,插入的时间复杂度依然是 Θ ( n ) \Theta(n) Θ(n),所以不能用二分搜索来优化插入排序。
7 ★
- 先调用归并排序
mergeSort
来对数组进行非递减排序,这一步时间复杂度为 Θ ( n lg n ) \Theta(n\lg n) Θ(nlgn); - 然后用双指针法来寻找是否存在两个元素之和为
sum
,这一步时间复杂度为 Θ ( n ) \Theta(n) Θ(n); - 总的时间复杂度是 Θ ( n lg n ) \Theta(n\lg n) Θ(nlgn)。
findSum(A, n, sum)
left = 1
right = n
while left < right
if A[left] + A[right] == sum
return left, right
else if A[left] + A[right] < sum
++left
else
--right
return NIL