Java SDK中的排序分为两种状况:算法
1、对基础类型数组的排序,使用DualPivotQuicksort类
a、若是是对char、short数组的排序,由于byte、char、short分别为8bit、16bit、16bit,能表示的最大数比较小(2^16):
因此,对它们的排序策略为数组长度小于32的时候使用直接插入排序、数组长度小于(12八、32768)的时候使用快速排序、其余使用计数排序(时间长,须要128或者32768长度的数组辅助)
b、对于其余几种基础类型的数组排序,由于长度大,不适用计数排序,故策略为:若是数组长度小于32,使用直接插入排序,不然使用快速排序
2、对于非基础类型的排序,使用ComparableTimSort类 采用的排序算法为二分插入排序,特色是每次向有序区域插入一个值时,不是逐个向前比较,而是采用二分查找的思路,和中间那个值比较。这个能减小查找的次数从N^2到nlogn,可是交换的次数仍然为N^2, 由于它是数组,而不是链表,没法直接插入到那个位置,仍是须要找到index以后的元素逐个后移,不过这里能够使用System.arrayCoy的方法,提升性能