一、算法效率
算法设计中,我们先后追求以下两个层面的目标。
- 找到问题解法:算法需要在规定的输入范围内,可靠地求得问题的正确解。
- 寻求最优解法:同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。
在能够解决问题的前提下,算法效率是衡量算法优劣的主要指标,它包括以下两个维度:
- 时间效率:算法运行速度的快慢。
- 空间效率:算法占用内存空间的大小。
简而言之,我们的目标是设计“既快又省”的算法。
二、时间复杂度
(一) 常数操作
一个操作如果和样本数据量没有关系,每次都是固定时间内完成操作,这样的操作成为常数操作。
(二) 时间复杂度
时间复杂度,是用来衡量:一个算法的执行,随数据规模增大,而增长的时间成本。
就是一个算法流程中,常数操作数量的一个指标。常用O
来表示。
具体来说,就是要先对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。
在表达式中,只要高阶项,不要低阶项,也不要高阶项系数,
评价算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。
(三) 空间复杂度
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
分析一个算法所占用的存储空间要从各方面综合考虑。如对于递归算法来说,一般都比较简短,算法本身所占用的存储空间较少,但运行时需要一个附加堆栈,从而占用较多的临时工作单元。若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。
三、常用排序算法时间复杂度
速记顺口溜:
- 关于稳定性:
-
- 不稳定:快选堆希(快速排序、选择排序、堆排序、希尔排序)
- 稳定:插冒归计基(简单插入排序、冒泡排序、归并排序、计数排序、基数排序)
- 关于移动次数和关键字顺序无关的排序:一堆(堆排序)乌龟(归并排序)选(选择排序)基(基数排序)友
类别 | 排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | ||
平均情况 | 最好情况 | 最坏情况 | ||||
插入排序 | 直接插入 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
shell 排序 | O(n1.5) | O(n) | O(n2) | O(1) | 不稳定 | |
选择排序 | 直接选择 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | O(nlog2n) | O(nlog2n) | O(n2) | O(1) | 不稳定 | |
交换排序 | 冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
快速排序 | O(nlog2n) | O(nlog2n) | O(n2) | O(nlog2n) | 不稳定 | |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 | |
基数排序 | O(d(r+n)) | O(d(rd+n)) | O(d(r+n)) | O(rd+n) | 稳定 | |
注:基数排序的复杂度中, |