数据量非常小的情况

如果数据量非常小,堆排序、归并排序、快速排序、桶排序、timeSort排序、计数排序的表现都是非常优异的;那么数据量非常小的情况下,我们应该选择哪种排序算法进行排序呢?笔者推荐堆排序或归并排序或快速排序或timesort排序,以下是参考条件

冒泡排序属于暴力排序,对cpu的运算负载非常大,直接忽略
插入排序,希尔排序,选择排序属于低阶排序算法,在本轮测试中表现不是非常好,而且其一般用于其他排序算法的辅助性工具,所以忽略
堆排序没有用到辅助性的数组,所以它占用的空间可以忽略为待排序数组的大小,测试中耗时最短,对栈的依赖适中,可以接受
归并排序用到了辅助性数组,所以它占用的空间可以忽略为两倍的待排序数组的大小,测试中耗时最短,对栈的依赖适中,比堆排序稍差
快速排序没有用到辅助性的数组,所以它占用的空间可以忽略为待排序数组的大小,测试中耗时偏短,但对栈的依赖最高,所以递归深度最深,比堆排序稍差
桶排序严格意义上说是一种策略,一种思想,且桶排序的执行效率与编码人员的综合素质息息相关,是一种下限极低,上限极高的极度自由的排序算法,用到小数据量的排序有点大材小用
timeSort是 jdk 官方默认排序算法,能被官方作为默认的排序算法,必然非常优秀;且它结合了归并排序和插入排序的优点
基数排序用到了辅助性数组,所以它占用的空间可以忽略为两倍的待排序数组的大小,测试中耗时偏高,但空间复杂度极低,也比较优秀
计数排序用到了模板性的辅助数组,所以它占用的空间可以很小,也可以很大,取决于待排序数组的分布情况,但时间复杂度极低,也比较优秀,如果待排序数组的最大最小值较小,可以考虑

数据量偏大的情况

如果数据量偏大的情况下,timeSort 排序算法的表现依旧非常卓越,必然为首选;因此数据量偏大的情况下 timeSort排序,归并排序,堆排序,快速排序,桶排序均可作为选择,对其余排序算法做简单分析

堆排序、归并排序在百万级数据量下的表现差距还不是很明显,且实际表现都比较优秀,可以作为选择
快速排序需要注意的是,从 100000 这个级别开始就会出现明显的爆栈问题,但是其综合变现还是非常优秀的,如果要使用,注意配置 jvm 参数
可以明显看出,在数据量达到 百万级别甚至更多 的情况下,桶排序开始发力了,且不鸣则已,一鸣惊人
计数排序算法的变现尤其优秀,但是它还是老问题,需要开发人员判断待排序序列的取值范围再做打算,否则可能会太过耗费内存空间