一、复杂度
排序方式 | 平均T(n) | 最坏T(n) | 最好T(n) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
插入排序 | O(n^2) | O(n^2) | O(n) | O(1) | 稳定 |
冒泡排序 | O(n^2) | O(n^2) | O(n) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
希尔排序 | O(n^1.3) | O(n^2) | O(n) | O(1) | 不稳定 |
快速排序 | O(nlogn) | O(n^2) | O(nlogn) | O(logn) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(n+rd) | 稳定 |
二、代码实现
1、直接插入排序 insert
1 | # 将 L[i] 插入到已经有序的子序列 L[1 2 ... i-1] 中 |
2、冒泡排序 bubble
1 | # 对相邻的元素两两进行比较,顺序相反则进行交换,这样每一趟最大的元素浮到顶端 |
3、简单选择排序 select
1 | # 第i趟排序从 L[i,i+1,...,n] 中选择关键字最小的元素与 L[i] 比较 |
4、希尔排序 shell(跳着插入排序)
1 | 距离为 di 的记录放在同一个组中,进行直接插入排序 |
5、快速排序 quick
1 | 待排序表 L[1,2,...,n] 中任取一个元素 pivot 作为基准或枢纽, |
6、堆排序 heap sort
1 | 大顶堆(完全二叉树):子节点小于父节点 |
7、二路归并排序 merge(分治)
1 | n 个记录看成是 n 个有序的子表,两两归并,得到 n/2 个有序表,再归并 |
8、基数排序 radix(桶排序)
1 | 对数字最高位优先和最低位优先进行排序 |