提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、底层排序方法
1.int
- 如果元素个数小于47个,那么采用改进的插入排序进行排序(每次取两个进行排序)
- 如果元素个数大于47个并且小于快速排序的阙值286个,采用双轴快排。
- 当元素个数大于286个,首先检查整个数组的有序情况,检测过程中,会将整个数组排成一段一段的局部有序非递减的序列,并统计数组中有多少个这样的局部有序序列,当个数超过67个,说明整个数组是相对无序的,采用快排;小于67时,采用基于循环方法的递归排序。
2.Long
Long类型同int类型
3.Short、char
长度大于计数排序阙值是,用计数排序,否则和int相同;
4.Byte
如果长度大于计数排序的阈值的话,就进行计数排序,否则就进行简单的插入排序。后续三种的排序之所以使用计数排序是因为数值范围小
5.Float、double
先把NaN数放到数组的右边,然后和int一样,这种方式排完序之后缺点是无法进行+0和-0的排序。于是又进行了+0和-0的排序。
二、为什么sort根据快排实现,不用堆排?
- 堆排序访问数据方式没有快排友好,对于快排来说,数据是顺序访问的,而对于堆排来说,数据是跳着访问的,这对CPU缓存不友好。
- 对于同样的数据,在排序过程中,堆排序算法的交换次数要多于快排。对于基于比较的排序算法来说,整个排序过程是由两个基本操作组成的,比较和交换,快速排序的交换次数不会比逆序度多。但是堆排序第一步是建堆,建堆过程会打乱原有的相对选择顺序,导致数据有序性降低。比如对于一组已经有序的数据来说,经过建堆之后,数据反而变得更无序了。在快速排序中,每次数据移动都意味着该数据距离它正确的位置越来越近,而在堆排序中,类似将堆尾部的数据移到堆顶这样的操作只会使相应的数据远离它正确的位置,后续必然有一些操作再将其移动,即“做了好多无用功”。