排序算法分类
时间复杂度
一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,O(f(n))为算法的时间复杂度。
常见的算法复杂度:
- 常数阶O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(nlog2n)
- 平方阶O(n2)
- 立方阶O(n3)
- k次方阶O(nk)
- 指数阶O(2n)
常见的时间复杂度对应图
常见算法时间复杂度由小到大依次为:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n)
随着问题规模 n 的不断增大,上述时间复杂度不断增大,算法的执行效率越低
常数阶O(1)
无论代码执行多少行,只要没有循环等复杂结构,即消耗的时间并不随着某个变量的改变而改变,那么这个代码的是时间复杂度就都是O(1)
int i = 1;
int j = 2;
++i;
j++;
int m = i+j;
对数阶O(log2n)
int i = 1;
while (i < n) {
i = i * 2;
}
循环log2n次后,循环结束
线性阶O(n)
for (i = 0; i < n; i++) {
j = i;
j++;
}
循环n次后结束,消耗时间随着n的变化而变化
线性对数阶O(nlog2n)
for (m = 1; m < n; m++) {
i = 1;
while (i < n) {
i = i * 2;
}
}
将时间复杂度为O(log2n)的代码循环n遍
平方阶O(n2)
for (x = 0; x < n; x++) {
for(i = 0; i < n; i++) {
j = i;
j++;
}
}
嵌套两次n循环
排序算法的时间复杂度
- 稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面;
- 不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面;
- 内排序:所有排序操作都在内存中完成;
- 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
- 时间复杂度: 一个算法执行所耗费的时间。
- 空间复杂度:运行完一个程序所需内存的大小。
- n: 数据规模
- k: “桶”的个数
- In-place: 不占用额外内存
- Out-place: 占用额外内存