什么是复杂度
算法的时间复杂度和空间复杂度
算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。
空间复杂度:类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。
时间复杂度的分析
- 对于赋值,输入输出语句为O(1)
- 对于顺序结构,采用求和法则,就是多个复杂度求和取最大的复杂度
- 对于循环结构,采用乘法法则,是复杂度的乘积
第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。
什么是大O表示法
由于程序运行所需的时间往往会受到机器性能与其他因素影响,用绝对的时间单位衡量算法的效率并不合适。在讨论算法复杂度的时候,我们一般关注它的近似值(渐进趋势),即渐进复杂度,常用大O表示法表示。
O(1) | 常数时间复杂度 |
O(log n) | 对数时间复杂度 |
O(n) | 线性时间复杂度 |
O(n^2) | 平方 |
O(n^3) | 立方 |
O(2^n) | 指数 |
O(n!) | 阶乘 |
各个复杂度的增长速度
稳定与不稳定
冒泡排序最好是
最好情况下的时间复杂度:如果元素本来就是有序的,那么一趟冒泡排序既可以完成排序工作,比较和移动元素的次数分别是n-1和0,因此最好情况的时间复杂度为O(n)。
最差情况的时间复杂度:如果数据元素本来就是逆序的,许哟啊进行n-1趟排序,所需比较和移动次数分别为n(n-1)/2和3n(n-1)/2。因此最坏情况子下的时间复杂度为O(n^2)。
稳定性:因为每次比较后如果两个相邻元素相等我们并不会将他们交换,所以冒泡不会改变相同元素的下标,所以冒泡排序是一个稳定的排序。
冒泡排序优化:不改变原数组,当循环到没有数据交互就跳出,用一个标志位来判断,break跳出。
选择排序
是原地排序,不稳定排序最好/最坏/平均:O(n²)。即使完全有序,也需要经过 ( n + 1 ) n / 2 次遍历