常见排序算法及其复杂度
排序方法 | 时间复杂度(最坏) | 时间复杂度(平均) | 时间复杂度(最好) | 空间复杂度 | 稳定性 | 复杂性 |
---|---|---|---|---|---|---|
插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | 稳定 | 简单 |
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | 稳定 | 简单 |
选择排序 | 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 ) O(1) O(1) | 不稳定 | 简单 |
希尔排序 | O ( n 2 ) O(n^2) O(n2) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | 不稳定 | 较复杂 |
快速排序 | O ( n 2 ) O(n^2) O(n2) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | 不稳定 | 较复杂 |
堆排序 | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( 1 ) O(1) O(1) | 不稳定 | 较复杂 |
归并排序 | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n log 2 n ) \left.O(n\log_2n\right) O(nlog2n) | O ( n ) O(n) O(n) | 稳定 | 较复杂 |
基数排序 | O ( d ( r + n ) ) \begin{array}{l}\left.O(d(r+n)\right)\\\end{array} O(d(r+n)) | O ( d ( r + n ) ) \begin{array}{l}\left.O(d(r+n)\right)\\\end{array} O(d(r+n)) | O ( d ( r d + n ) ) \begin{array}{l}\left.O(d(rd+n)\right)\\\end{array} O(d(rd+n)) | O ( r d + n ) O(rd+n) O(rd+n) | 稳定 | 较复杂 |
基数排序的复杂度中,r代表关键字的基数,d代表长度,n代表关键字的个数
适用情况
冒泡:数据量量不大,对稳定性有要求,且数据基本有序
选择:数据量不大,且对稳定性没有要求
堆排序适合处理大数据(找出一千万个数中最小的前一百个数)
思路:建立一百个节点的大顶堆,首先将前一百个数放入堆中,之后每放入一个数就删除一个堆顶元素,最后剩下的就是最小的一百个数。
归并排序效率非常不错,在数据规模较大的情况下,比希尔排序和堆排序要好。
summary:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但前面介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子序列,然后再两两归并之。因为直接插入排序是稳定 的,所以改进后的归并排序仍是稳定的
冒泡
选择排序
插入排序
希尔
归并
快排
基数
堆排
REF
https://www.cnblogs.com/onepixel/articles/7674659.html
https://blog.csdn.net/qi_700/article/details/77193805