2.1节
1 insertion-sort(A) 插入排序法 (非降序排列) //复杂度为θ(n^2) 2 3 for j=2 to length[A] 4 5 { 6 7 do key=A[j] 8 9 i=j-1 10 11 while i>0 and A[i]>key 12 13 { 14 15 do A[i+1]=A[i] 16 17 i=i-1 18 19 } 20 21 A[i+1]=key 22 23 }
2.2节
将一个整数的(二进制)各位向左移k位,相当于将该数乘上2^k,但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
2.3节
devide-and-conquer 分治法
很多算法结构上呈现递归,不断调用本身去解决子问题,然后合并来解决原问题。
举例:merge-sort 合并排序法
Divide:将n个元素分成各含n/2个元素的子序列
Conquer:用合并排序法对两个子序列递归地排序
Combine:合并已排序的子序列以得到排序结果
当子序列长度为1时,递归结束,单个元素被看做已排序好的。
1 merge(A,p,q,r) //A是一个数组,p,q,r都是下标,且p<=q<r,该过程假设子数组A[p..q],A[q+1..r]都已排好序 2 n1=q-p+1 3 n2=r-q //计算子数组长度 4 create arrays L[1..n1+1] and R[1..n2+1] 5 for i=1 to n1 6 do L[i]=A[p+i-1] 7 for j=1 to n2 8 do R[j]=A[q+j] 9 L[n1+1]=无穷大 //称这个为两堆排序完好的扑克牌底部的哨兵牌,我们设想的是当一堆牌全部取出来之后可以将剩下的另外一堆牌直接丢进合并堆中,哨兵牌不可能小于某一张牌,所以它相当于实现了这一设想。 10 R[n2+1]=无穷大 11 i=1 12 j=1 13 for k=p to r 14 do if L[i]<=R[i] 15 then A[k]=L[i] 16 i++ 17 else A[k]=R[j] 18 j++
以上就是合并排序的merge过程,它的复杂度是θ(n)。
分治法的精髓
合并排序的时间复杂度为θ(nlgn),对数函数的增长速度比任何线性函数增长都要慢。
第三章
函数的增长
渐进确界,渐进上界,渐进下界的三个符号的定义以及曲线图,非常形象。
这块渐进符号的还是比较乱,以后再实践。