排序算法
术语解释
1. 稳定排序
如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
2. 非稳定排序
如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
3. 原地排序
原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
4. 非原地排序
需要利用额外的数组来辅助排序。
5. 时间复杂度
一个算法执行所消耗的时间。
6. 空间复杂度
运行完一个算法所需的内存大小。
| 分类 | 算法 |
|---|---|
| 交换排序 | 冒泡排序 鸡尾酒排序 奇偶排序 梳排序 侏儒排序 臭皮匠排序 Bogo排序 |
| 选择排序 | 选择排序 堆排序 平滑排序 笛卡尔树排序 锦标赛排序 圈排序 弱堆排序 |
| 插入排序 | 插入排序 希尔排序 伸展排序 二叉查找树排序图书馆排序 耐心排序 |
| 归并排序 | 归并排序 梯级归并排序 振荡归并排序 多相归并排序 |
| 分布排序 | 桶排序 计数排序 基数排序 美国旗帜排序 珠排序 爆炸排序 比较计数排序 插值排序 鸽巢排序相邻图排序 闪电排序 |
| 并发排序 | 双调排序器 Batcher归并网络 两两排序网络 |
| 混合排序 | 块排序 Tim排序 内省排序 Spread排序 归并插入排序 |
| 其他 | 拓扑排序 煎饼排序 意粉排序 |

稳定性
稳定的排序
- 冒泡排序(bubble sort)—
- 插入排序(insertion sort)—
- 归并排序(merge sort)—
;需要
额外空间
- 基数排序(radix sort)—
;需要
额外空间
- 计数排序(counting.md sort)—
;需要
额外空间
- 桶排序(bucket sort)—
;需要
额外空间
- 鸡尾酒排序(cocktail sort)—
- 原地归并排序—
如果使用最佳的现在版本
- 二叉排序树排序(binary tree sort)— 期望时间;最坏时间;
额外空间
- 鸽巢排序(pigeonhole sort)—
;需要
额外空间
- 侏儒排序(gnome sort)—
- 图书馆排序(library sort)—
期望时间;
最坏时间;需要
额外空间
- 块排序(block sort)—
不稳定的排序
- 选择排序(selection sort)—
- 快速排序(quick sort)—
期望时间,
最坏情况;对于大的、随机数列表一般相信是最快的已知排序
- 希尔排序(shell sort)—
如果使用最佳的现在版本
- 堆排序(heap sort)—
- 克洛弗排序(Clover sort)—
期望时间,
最坏情况[来源请求]
- 梳排序—
- 平滑排序(smooth sort)—
- 内省排序(introsort)—
- 耐心排序(patience sort)—
最坏情况时间,需要额外的
空间,也需要找到最长的递增子序列(longest increasing subsequence)
不实用的排序
- Bogo排序—
,最坏的情况下期望时间为无穷。
- Stupid排序—
;递归版本需要
额外存储器
- 珠排序(bead sort)—
或
,但需要特别的硬件
- 煎饼排序—
,但需要特别的硬件
- 臭皮匠排序(stooge sort)算法简单,但需要约
的时间
不使用第三个变量交换数字
// 使用第三个变量
temp = n
n = m
m = temp
// 不使用第三个变量
m = m + n
n = m - n
m = m - n
m ^= n
n ^= m
m ^= n
资料
基数排序、桶排序和计数排序的区别
Visualizing Algorithms
超详细十大经典排序算法总结
排序算法 wiki
十大经典排序算法
十大经典排序算法
十大经典排序算法,看这篇就够了
十大排序算法总结 内部排序
这或许是东半球讲十大排序算法最好的一篇文章
leetcode里的十大算法
BigO
十大经典排序算法 可参考待处理