排序算法的重要性不言而喻,为了加深对这十种算法的理解,固写此文。
目录
- 1、冒泡排序(Bubble Sort)
- 2、选择排序(Selection Sort)
- 3、插入排序(Insertion Sort)
- 4、希尔排序(Shell Sort)
- 5、归并排序(Merge Sort)
- 6、快速排序(Quick Sort)
- 7、堆排序(Heap Sort)
- 8、计数排序(Counting Sort)
- 9、桶排序(Bucket Sort)
- 10、基数排序(Radix Sort)
首先可用如下表来简单概括这十种算法:
十大经典排序算法 | 平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | O \Omicron O (n2 ) | O \Omicron O (n) | O \Omicron O (n 2 ) | O \Omicron O (1) | In-place | 稳定 |
选择排序 | O \Omicron O (n2 ) | O \Omicron O (n 2 ) | O \Omicron O (n 2 ) | O \Omicron O (1) | In-place | 不稳定 |
插入排序 | O \Omicron O (n2 ) | O \Omicron O (n) | O \Omicron O (n 2 ) | O \Omicron O (1) | In-place | 稳定 |
希尔排序 | O \Omicron O (n2 ) | O \Omicron O (n) | O \Omicron O (n 2 ) | O \Omicron O (1) | In-place | 不稳定 |
归并排序 | O \Omicron O (nlog \loglo g 2 n) | O \Omicron O (n log \log lo g 2 n) | O \Omicron O (n log \log lo g 2 n) | O \Omicron O (n) | Out-place | 稳定 |
快速排序 | O \Omicron O (nlog \loglo g 2 n) | O \Omicron O (n log \log lo g 2 n) | O \Omicron O (n 2 ) | O \Omicron O ( log \log lo g 2 n) | In-place | 不稳定 |
堆排序 | O \Omicron O (nlog \loglo g 2 n) | O \Omicron O (n log \log lo g 2 n) | O \Omicron O (n log \log lo g 2 n) | O \Omicron O (1) | In-place | 不稳定 |
计数排序 | O \Omicron O (n+k) | O \Omicron O (n+k) | O \Omicron O (n+k) | O \Omicron O (k) | Out-place | 稳定 |
桶排序 | O \Omicron O (n+k) | O \Omicron O (n+k) | O \Omicron O (n 2 ) | O \Omicron O (n+k) | Out-place | 稳定 |
基数排序 | O \Omicron O (n*k) | O \Omicron O (n*k) | O \Omicron O (n*k) | O \Omicron O (n+k) | Out-place | 稳定 |
表中数据说明:
- 稳定:如果A原本在B前面,而A=B,排序之后A仍然在B的前面;
- 不稳定:如果A原本在B的前面,而A=B,排序之后A可能会出现在B的后面;
- 时间复杂度: 描述一个算法执行所耗费的时间;
- 空间复杂度:描述一个算法执行所需内存的大小;
- n:数据规模;
- k:“桶”的个数;
- In-place:占用常数内存,不占用额外内存;
- Out-place:占用额外内存。
该十种排序算法可分为如下所示的两大类
- 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n log \log log n),因此也称为非线性时间比较类排序。
- 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
1、冒泡排序(Bubble Sort)
算法步驟
- 比较相邻的元素,如