1. 排序算法的介绍
定义:排序是将一组数据,依指定的顺序进行排列的过程
排序的分类:
- 内部排序:将需要处理的所有数据都加载到内部存储器中进行排序
- 插入排序(直接插入排序、希尔排序)
- 选择排序(简单选择排序、堆排序)
- 交换排序(冒泡排序、快速排序)
- 归并排序
- 基数排序
- 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行
排序
2. 各排序算法的时间复杂度情况
排序法 | 平均时间 | 最好情形 | 最差情形 | 空间复杂度 | 稳定性 | 排序方式 | 性能测试 | 备注 |
---|---|---|---|---|---|---|---|---|
冒泡 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O(1) | 稳定 | In-place | 对于8万个元素的数列,用时16秒 | n小较好 |
选择 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O(1) | 不稳定 | In-place | 对于8万个元素的数列,用时3秒 | n小较好 |
插入 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O(1) | 稳定 | In-place | 对于8万个元素的数列,用时5秒 | 大部分已排序时较好 |
希尔Shell | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n s ) O(n^s) O(ns) 1 < s < 2 | O(1) | 不稳定 | In-place | 交换法对于8万个元素的数列,用时16秒;移动法对于8万个元素的数列,用时1秒 | s是所选分组 | |
快速 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n 2 ) O(n^2) O(n2) | O ( n l o g n ) O(nlogn) O(nlogn) | 不稳定 | In-place | 对于8万个元素的数列,用时不到1秒;80万个元素的数列,用时1秒 | n大较好 |
归并 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O(1) | 稳定 | Out-place | 对于8万个元素的数列,用时不到1秒;80万个元素的数列,用时1秒 | n大较好 |
基数 | O ( l o g R B ) O(log_RB) O(logRB) | O ( l o g R B ) O(log_RB) O(logRB) | O(n) | 稳定 | Out-place | 对于80万个元素的数列,用时不到1秒;800万个元素的数列,用时1秒;8000万个元素的数列,直接内存溢出 | B是真数(0-9),R是基数(个十百) | |
堆 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O(1) | 不稳定 | In-place | 800万个元素的数列,用时3秒 | n大较好 |
交换 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O(1) | 不稳定 | n小较好 |
说明:
- 稳定性是指当两个相同的元素,进行排序后,它们的次序并不会发现变化
- In-place表示为了完成排序,不新建其它临时数组;Out-place表示新建其它临时数组