1.常见的排序算法的平均时间复杂度、最好情况的时间复杂度、最坏情况的时间复杂度、稳定性、是否基于比较的表格
这里,n是要排序的元素数量,k是元素的取值范围。对于基于比较的排序算法,k没有意义,因为这些算法不关心元素的具体值,只关心元素之间的相对顺序。对于非基于比较的排序算法(如计数排序、桶排序和基数排序),k是一个重要的参数,因为这些算法的性能依赖于元素的取值范围。
2.常见的算法时间复杂度,从快到慢
1. O(1):常数时间复杂度。无论输入的规模如何,执行时间总是固定的。例如,数组的索引访问。
2. O(log n):对数时间复杂度。随着输入规模的增大,执行时间会以对数的速度增加。例如,二分查找。
3.O(sqrt(n)):位于O(n)和O(log n)之间。虽然它比线性时间复杂度慢,但是对于非常大的n,O(sqrt(n))的增长速度会比O(n)慢很多。这种时间复杂度在某些特定的算法中会出现,例如检查一个数是否是素数的最简单方法就是试除法,时间复杂度为O(sqrt(n)),因为我们只需要检查到sqrt(n)就可以确定n是否是素数。
4. O(n):线性时间复杂度。执行时间与输入规模成正比。例如,遍历一个数组或链表。
5. O(n log n):线性对数时间复杂度。执行时间与输入规模成正比,但每次操作的复杂度为O(log n)。例如,快速排序和归并排序。
6. O(n^2):平方时间复杂度。执行时间与输入规模的平方成正比。例如,冒泡排序和选择排序。
7. O(n^3):立方时间复杂度。执行时间与输入规模的立方成正比。例如,三层嵌套循环的算法。
8. O(2^n):指数时间复杂度。执行时间以2为底的指数增长。例如,计算斐波那契数列的递归实现。
9. O(n!):阶乘时间复杂度。执行时间与输入规模的阶乘成正比。例如,旅行商问题的暴力解法。
在这些时间复杂度中,O(1)是最快的,O(n!)是最慢的。当我们在设计和选择算法时,我们通常希望选择时间复杂度尽可能低的算法。但是,我们也需要考虑其他因素,如空间复杂度、代码的复杂性、实现的难度等。