2.3-4
其中D(n)为分解问题成子问题所需要的时间
C(n)为合并子问题的解成原问题的解
2.3-5
伪代码
Binary_Search(L, R, A, key)
mid = (L + R) / 2
if(A[mid] == key)
return mid
if(L == R) return false
if(A[mid] > key)
Binary_Search(mid + 1, R, A, key)
else Binary_Search(L, mid, A, key)
T(n) = T(n/2) + D(n) + C(n)
二分查找,每查找一个数,就能排除一半。除几次之后,范围锁定。次数变为
2.3-6
我们先看一下原来的代码
while i>0 and A[i] > key
A[i + 1] = A[i]
i = i - 1;
key是什么值,key的值是A[j]的值
i的值为j-1。也就是说,j之前的值,也就是A[1, j - 1]都是排好序的,从小到大。
如果都是排好序的,寻找key,那么我们是不是可以使用二分查找了。
我们可以把上述代码替换为:
pos = Binary_Search(A, key)
temp = A[j]
while j > pos
A[j] = A[j - 1]
j = j - 1
A[pos] = temp
Binary_Search的时间复杂度是
总共做Binary_Search的次数是:
而插入需要移动的次数是:1 + 2 + 3 + ... + n
所以总体来看时间复杂度依然是