1.前缀树
- 单个字符串中,字符从前到后的加到一颗多叉树上
- 生成树的代价为O(N)
2.桶排序
- 时间复杂度O(N),额外空间复杂度O(M)
- 不基于比较的排序
- 缺点:应用范围有限,需要样本的状况满足桶的划分,一旦要求升级,改写代价很高
- 计数排序
一般,样本是整数,且范围较窄
- 基数排序
一般,样本是10进制的正整数
3.排序算法的稳定性
稳定性是指同样大小的样本在排序之后不会改变相对次序
对于基础类型来说,稳定性毫无意义
对非基础类型来说,稳定性有重要意义
排序算法 | 是否能实现稳定性 | 如何实现 | 时间复杂度 | 额外空间复杂度 |
---|---|---|---|---|
选择排序 | n | 算法原理决定无法实现稳定性,eg: 3 3 3 3 3 1 3 3 3 | O(N^2) | O(1) |
冒泡排序 | y | 遇到相等数据不交换 | O(N^2) | O(1) |
插入排序 | y | 遇到相等数据停止交换 | O(N^2) | O(1) |
归并排序 | y | merge时遇到相等数据先拷贝左边,再拷贝右边 | O(N*logN) | O(N) |
快速排序 | n | partition过程破坏了稳定性 | O(N*logN) | |
堆排序 | n | 只关注自己的结构 | O(N*logN) | O(1) |
计数排序 | y | O(N) | O(M) | |
基数排序 | y | O(N) | O(N) |
4. 排序算法总结
- 不基于比较的 排序,对样本数据有严格要求,不易改写
- 基于比较的排序,只要规定好两个样本如何比较就能直接复用
- 基于比较的排序,时间复杂度极限为O(N*logN)
- 时间复杂读O(N*logN),额外空间复杂度低于O(N),且稳定基于比较的排序不存在
- 绝对速度选快排,省空间选堆排,稳定性选归并
5.坑
- 归并排序的额外空间复杂度可以变成O(1),“归并排序 内部缓存法”,但是将失去稳定性。用堆不好么???
- “原地归并排序”是垃圾,会让时间复杂度变成O(N^2)
- 快排稳定性改进,“01 stable sort”,但是会对样本数据要求更多。用桶排序不好么???
- 在整型数组中,请把奇数放在数组左边,偶数放在数组右边,要求所有奇数之间的原始的相对次序不变,所有偶数之间原始相对次数不变
时间复杂度做到O(N),额外空间复杂度做到O(1)
答:0/1标准的partition过程,无法做到稳定性,否则快排为啥不是稳定的呢???我不会,你来告诉我