算法概述
算法分类
十种常见排序算法可以分为两大类:
- 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
根据使用内外存分类
排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。八大排序指内部排序。
算法复杂度
相关概念
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
- 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
- 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
1、为什么比较排序算法的时间下界是O(nlogn)?
- 所谓的比较排序是指通过比较来决定元素间的相对次序。
- “定理:对于含n个元素的一个输入序列,任何比较排序算法在最坏情况下,都需要做Ω(nlgn)次比较。”也就是说,比较排序算法的运行速度不会快于nlgn,这就是基于比较的排序算法的时间下界。
- 通过决策树(Decision-Tree)可以证明这个定理,决策树的叶子代表可能的排序结果,则树的高度就是比较排序的最多比较次数,n个元素的二叉决策树有n!个不重复叶子节点(每个叶子结点代表一个排序结果,可能的排序结果是n的排列组合,故有n!个),n!个叶子节点的二叉树的高度h=Ω(nlogn)
- 根据上面的证明,我们知道任何比较排序算法的运行时间不会快于nlgn。那么我们是否可以突破这个限制呢?当然可以,接下来我们将介绍三种线性时间的排序算法,它们都不是通过比较来排序的,因此,下界O(nlogn)对它们不适用。
- 分别是计数排序(Counting Sort)(O(n+k))、桶排序(Bucket Sort)(O(n+k))和基数排序(Radix Sort)(O(n*k))