Java SDK中的sort算法小议
在学习数据结构和算法的时候,很多书籍或资料会将每个知识点分开去讲,这种方法可以帮助我们循序渐进地理解对应的知识点。
在排序算法里边,书本上常见的会有
- 冒泡排序 (bubble sort) - 思想很简单,但是实际当中基本不会使用
- 插入排序 (insertion sort) - 同样也很简单,会经常在一些小数据量的时候使用
- 选择排序 (selection sort) - 不稳定
- 快速排序 (quick sort) - 不稳定,理论上最快
- 归并排序 (merge sort) - 稳定,性能比较均衡
不太常见的还会有
- 计数排序 (counting sort)
- 桶排序 (bucket sort)
- 基数排序 (radix sort)
最开始接触的时候以为在实际的使用当中,是相互独立存在的。比如我预计到数据量比较小,那么就使用插入排序,否则丢给快排去处理。
但是学习了JDK中的实现之后,发现真正应用在生产环境中的代码其实是多种排序思想组合使用。这里以Java中最常见的两种排序 - Collections.sort
和Arrays.sort
,来粗略看看它是怎么工作的,另外是它对优化的极致追求。
注意,这里暂时不会cover更为复杂的parallel sort
,它的内容可能是另外一个专门的话题了。
两种常见的sort
了解一下调用流程 - 从对外接口到真正实现
接下来分析的代码基于JDK 1.8.1 u121
先看一下调用流程
Collections.sort