正文
懒得写过程了,少量的数学推导。
直接上结论:
- 时间复杂度用的更多,人的耐心,你懂得;
- 时间复杂度低了,有时候会牺牲空间复杂度;
- 主要跟计算次数有关系,所以计算的是次数x,n是参数值;
- T(n) = O(f(n));举例:fn具体的可能是nlogn+1+n,大O写法就是,O(nlogn),即,取最高阶(因为对时间影响最大)
对于不同的时间增长影响,有图,一般而言O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(Cn)
时间复杂度分析的基本策略是:从内向外分析,从最深层开始分析。如果遇到函数调用,要深入函数进行分析。
编码中,要对自己写的一些算法有一定的敏感度,比如多层循环,比如较为复杂的调用(找最长的链),有预估能力,以及调优的能力
各种排序算法情况
时间复杂度记忆-
- 冒泡、选择、直接 排序需要两个for循环,每次只关注一个元素,平均时间复杂度为O(n2)O(n2) O(n^2)(一遍找元素O(n)O(n) O(n) ,一遍找位置O(n)O(n) O(n) )
- 快速、归并、希尔、堆基于二分思想,log以2为底,平均时间复杂度为O(nlogn)O(nlogn) O(nlogn) (一遍找元素O(n)O(n) O(n) ,一遍找位置O(logn)O(logn) O(logn) )
- 稳定性记忆-“快希选堆”(快牺牲稳定性)
- 排序算法的稳定性:排序前后相同元素的相对位置不变,则称排序算法是稳定的;否则排序算法是不稳定的。
以及表
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 | 复杂性 |
---|---|---|---|---|---|---|
直接插入排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 | 简单 |
希尔排序 | O(nlog2n) | O(n2) | O(n) | O(1) | 不稳定 | 较复杂 |
直接选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 | 简单 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 | 较复杂 |
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 | 简单 |
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(nlog2n) | 不稳定 | 较复杂 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 | 较复杂 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(n+r) | 稳定 | 较复杂 |
图片