算法导论第一课

计算机性能
比性能更重要的是?
正确性、简介、可维护性、稳定性、健壮性、特性、功能性、模块化、安全、可扩展性、用户体验


性能的重要性?
性能的好与坏直接决定着可行、不可行。比如实时数据
有趣,我们向往速度。


排序问题?
输入:a1,a2,...an 
输出:a1`<=a2`<=...<=an`
插入排序 
算法复杂度  θ(n^2)
伪代码
INSERTION SORT   A[1,2,3... n]
for j <- 2  to n
do key <- A[j]
i <- j-1
while i>0 and A[i]>key
   do A[i+1]<-A[i]
      i <- i-1
A[i+1] <- key


运行时间的决定因素
已排序程度
输入规模
运行的上界
平均值  涉及到每种情况出现的概率
运行的下界
计算机的计算能力(一般用两种算法在同一台计算机上的表现)




算法的大局观
渐进分析
1.忽略掉依赖于机器的常量
2.不去检查实际的运行时间,而是关注运行时间的增长


渐进符号
θ  读作Theta
写个公式,弃去它的低阶项,并忽略前面的常数因子




归并排序
merge  sort A[1,2,3... n]
1.if n = 1 ,done
2.对  A[1,2,3,..n/2] 、  A[n/2,...n] 分别排序
3.把两个排好序的表归并


20   12
13   11  
7    9
2    1


先比较2和1,1比较小,则为第一个,剩下2,
2去跟9比较,2比较小,为第二个,剩下9,
9跟7比较,7比较小,为第三个,剩下9,
9跟13比较,9比较小,为第四个,剩下13,
13跟11比较,11比较小,为第五个,剩下13,
13跟12比较,12比较小,为第六个,剩下13,
13跟20比较,13比较小,为第七个,剩下20,
20为最后一个,为第八个。
每一次比较只关注两个元素,挑出最小的,再把数组指针推进一位。
把两个表归并的时间为θ(n).


总时间T(n) =  T(1,2,..N/2) + T(n/2,...n)  + θ(n)         (n>1)
      T(n) =  2T(N/2)  +  θ(n)                           (n>1)


递归树
T(n) = 2T(n/2) + cn                (用cn显式函数替换了隐式的θ(n) )


时间复杂度T(n)= θ(nlgn)

你可能感兴趣的:(算法导论,归并排序,插入排序,算法导论)