算法导论第三版习题8.2

8.2-1

(a)首先通过第4到第5行,数组 C={2,2,2,2,1,0,2} ,然后经过第7行到第8行,数组 C={2,4,6,8,9,9,11}
(b) 然后根据第10行到第12行,我们有首先 B[C[A[11]]]=B[6]=2 ,此时 C={2,2,2,2,8,9,9,10} 。然后经过循环可以分别得到 B[8]=3 , B[3]=1 , B[4]=1 , B[11]=6 , B[2]=0 , B[9]=4 , B[7]=3 , B[5]=2 , B[1]=0 , B[10]=6 。所以 B={0,0,1,1,2,2,3,3,4,6,6}

8.2-2

因为再给数组 B 填充数据时,我们是从数组 A 的最后一位开始往前循环的,而且每次给数组 B 中填充一个数据都会将该数在数组 C 中的计数减一,所以数组 A 中,该数之前如果还有与他相等的数,将被填充在数组 B 中该数的前一位,从而保证了具有相同值的元素在输出数组中的相对次序与他们在输入数组中的相对次序相同,即是稳定的。

8.2-3

该算法仍然是正确的,但此时它将不再是稳定的了。因为此时将从数组 A 的开始往后遍历,具有相同值得元素靠前的将被首先放在数组 B 的相对靠后的位置,从而破坏了稳定性。

8.2-4

ALGORITHM(A,k)
1 let C[0..b-a] be a new array
2 for i = 0 to k
3   C[i] = 0
4 for j = 1 to A.length
5   if x = A[j] - a <= b - a and x >= 0
6     C[x] = C[x] + 1
7 for i = 1 to k
8   C[i] = C[i] + C[i - 1]
9 return C[b-a]

你可能感兴趣的:(算法)