排序算法 | 最好时间 | 平均时间 | 最坏时间 | 辅助空间 | 稳定性 | 备注 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 | n小时比较好 |
简单插入排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 | 大部分已有序时比较好 |
冒泡排序 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 | n小时较好 |
希尔排序 | O(n) | O(nlogn) | O(n^s)1<s<2 | O(1) | 不稳定 | s是所选分组 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | 不稳定 | n大时较好 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 | n大时较好 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 稳定 | n大时较好 |
详细博文:https://www.cnblogs.com/onepixel/articles/7674659.html
排序算法及应用场景 https://blog.youkuaiyun.com/p10010/article/details/49557763
一.排序算法分类
1.插入排序法
直接插入排序,希尔排序(面试最常问)
2.交换排序
冒泡排序,快速排序(面试最常问)
3.选择排序
直接选择排序,堆排序(面试最常问)
4.归并排序
归并排序
5.基数排序
当然排序算法博大精深,肯定不止以上几种,本人只列出了几个最为经典的,也是最常用的排序算法。
二.空间、时间复杂度、稳定性
三.性能分析
1.O(n^2)性能分析
平均性能为O(n^2)的有:直接插入排序,选择排序,冒泡排序
在数据规模较小时(9W内),直接插入排序,选择排序差不多。当数据较大时,冒泡排序算法的时间代价最高。性能为O(n^2)的算法基本上是相邻元素进行比 较,基本上都是稳定的。
2.O(nlogn)性能分析
平均性能为O(nlogn)的有:快速排序,归并排序,希尔排序,堆排序。其中,快排是最好的,其次是归并和希尔,堆排序在数据量很大时效果明显(堆排序适合处理大数据)。
大数据处理的一个例子:找出一千万个数中最小的前一百个数。
思路:建立一百个节点的大顶堆,首先将前一百个数放入堆中,之后每放入一个数就删除一个堆顶元素,最后剩下的就是最小的一百个数。当然也可以分区处理,感兴趣的小伙伴可以网上搜一下大神们的帖子。
这四种排序可看作为“先进算法”,其中,快排效率最高(大数据就不行了,而且速度有概率性),但在待排序列基本有序的情况下,会变成冒泡排序,接近O(n^2).
希尔排序对增量的标准没有较为满意的答案,增量对性能会有影响。
归并排序效率非常不错,在数据规模较大的情况下,比希尔排序和堆排序要好。
多数先进的算法都是因为跳跃式的比较,降低了比较次数,但牺牲了排序的稳定 性。
3. 稳定性分析
分析稳定性之前首先要了解什么是稳定性,简单讲吧,要排序的数中有两个相同的数,用A算法进行排序后,两个相等数的位置不会互换,则A算法是稳定的,否则A不稳定。没听懂??那来个例子吧,现在要排序1,2,2这三个数,我们用A算法排序,如果排序后两个2的位置不会互换,则A算法是稳定的,如果互换了,则A算法就是不稳定的(如果还没听懂,那我真的没办法了!!!)。好了,下面我们看肯那些是稳定的哪些是不稳定的吧。
稳定排序
插入排序,冒泡排序,二叉树排序,归并排序
不稳定排序
快速排序(快),希尔排序(些),选择排序(选),堆排序(一堆)。