本文共 2712 字,大约阅读时间需要 9 分钟。
http://www.cnblogs.com/Jiajun/archive/2013/05/02/3055460.html
2-1
a. 每个子序列的元素数量为k,最差的情况下需要进行 k(k−1)/2 次基础操作,一共有 n/k 个子序列,所以总的基础操作次数为
2-2
a. 需要证明最终的序列是非递减的,还需要证明最终序列是原序列的一种排列。
b.
2-3
a. 循环中的运算可以在常量时间内完成,所以复杂度是 Θ(1) ,循环次数为n,所以总的时间复杂度为 Θ(n) 。
b.
1 2 3 4 5 6 7 8 | Evaluate-Polynomial(A, x, n) y = 0 for k = 0 to n t = 1 for i = 1 to k t = t * x; y = y + A[k] * t return y |
2-4
a. (8, 6) (2, 1) (3, 1) (8, 1) (6, 1)
b. 拥有逆序数最多的是 { n,n−1,⋯,3,2,1} ,其中任意两个数之间都是逆序的,所以总计 n(n−1)/2 个。
c. 逆序数应该与元素移动的数量相同。插入排序每次移动元素都将一个较大的数移到较小的数后面,使得总逆序数减少1,而排序完成后逆序数是0,所以开始的逆序数和元素移动的次数相同。
d.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | Merge-Inversion(A, p, q, r) n1 = q - p + 1 n2 = r - q let L[1..n1] and R[1..n2] be new arrays for i = 1 to n1 L[i] = A[p + i - 1] for j = 1 to n2 R[i] = A[q + j] i = 1, j = 1, k = p, inv = 0 while i <= n1 and j <= n2 if L[i] <= R[j] A[k] = L[i] i = i + 1 else inv = inv + n1 - i + 1 A[k] = R[j] j = j + 1 k = k + 1 while i v= n1 A[k] = L[i] i = i + 1 k = k + 1 while j <= n2 A[k] = R[j] j = j + 1 k = k + 1 return inv Calculate-Inversion(A, p, r) inv = 0 if p < r q = (p + r) / 2 inv = inv + Calculate-Inversion(A, p, q) inv = inv + Calculate-Inversion(A, q, r) inv = Merge-Inversion(A, p, q, r) return inv |