最近面试经常会碰到一些排序上的题目,所以回去之后一直在巩固这方面的知识。
对于排序算法,我们不能仅看他的效率有多高,还要观察他所占用空间大小和稳定性。
一、排序的关键因素
1、空间
In-place sort:插入排序、选择排序、冒泡排序、堆排序、快速排序。
Out-place sort:归并排序、计数排序、基数排序、桶排序。
这就说明,当数据量过大时,选择 In 排序的比较明智的,因为 Out 排序所占用的内存和空间都比较大,而 In 排序不需要。
2、稳定性
对于排序算法,我们不能仅看他的效率有多高,还要观察他所占用空间大小和稳定性。
一、排序的关键因素
1、空间
In-place sort:插入排序、选择排序、冒泡排序、堆排序、快速排序。
Out-place sort:归并排序、计数排序、基数排序、桶排序。
这就说明,当数据量过大时,选择 In 排序的比较明智的,因为 Out 排序所占用的内存和空间都比较大,而 In 排序不需要。
2、稳定性
stable sort:插入排序、冒泡排序、归并排序、计数排序、基数排序、桶排序。
unstable sort:选择排序、快速排序、堆排序。
为什么稳定性这么重要?原因很简单,假如你的排序算法经常碰到一些让你耗费大量时间去排序的数据,这明显会影响整体代码运行效率。
二、九大排序算法总结
当然,下面所讲的排序算法都是未经过优化的原始方法。
1、插入排序
插入排序的最优时间数据是已排好序的时候,复杂度为O(n),最坏时间数据是倒叙的时候,负责度是O(n^2)。
而且插入排序比较适合适用少量数据的排序。
2、冒泡排序
冒泡排序的最坏时间是O(n^2),其未作处理的最优时间也是O(n^2),但是做过处理后的最优时间是O(n)。
3、选择排序
最优和最坏时间都是O(n^2),优化后最优时间是O(n)。
4、归并排序
分治法思想,最优时间 O(nlgn),最坏时间 O(nlgn)。
5、快速排序
该算法的缺点和改进方法也已经在上一篇日志里详细说过,在这就不多说了。
6、堆排序
最优时间 O(nlgn),最差时间 O(nlgn)。
7、计数排序
最优排序时间 O(n+k),最坏排序时间 O(n+k)。
8、基数排序
最优时间 O((n+k)d),最坏时间 O((n+k)d)。
9、桶排序
最优时间O(n),最坏时间O(n^2)。
为什么稳定性这么重要?原因很简单,假如你的排序算法经常碰到一些让你耗费大量时间去排序的数据,这明显会影响整体代码运行效率。
二、九大排序算法总结
当然,下面所讲的排序算法都是未经过优化的原始方法。
1、插入排序
插入排序的最优时间数据是已排好序的时候,复杂度为O(n),最坏时间数据是倒叙的时候,负责度是O(n^2)。
而且插入排序比较适合适用少量数据的排序。
2、冒泡排序
冒泡排序的最坏时间是O(n^2),其未作处理的最优时间也是O(n^2),但是做过处理后的最优时间是O(n)。
3、选择排序
最优和最坏时间都是O(n^2),优化后最优时间是O(n)。
4、归并排序
分治法思想,最优时间 O(nlgn),最坏时间 O(nlgn)。
5、快速排序
该算法的缺点和改进方法也已经在上一篇日志里详细说过,在这就不多说了。
6、堆排序
最优时间 O(nlgn),最差时间 O(nlgn)。
7、计数排序
最优排序时间 O(n+k),最坏排序时间 O(n+k)。
8、基数排序
最优时间 O((n+k)d),最坏时间 O((n+k)d)。
9、桶排序
最优时间O(n),最坏时间O(n^2)。