为什么java默认的排序算法采用归并排序Timsort
java排序的过程描述
1、N<47 插入排序
2、47<N<286 双轴快排
3、286<N 连续性好 归并排序(Timsort)
4、286<N 连续性不好 双轴快排
双轴快速排序是对普通快速排序的优化,普通快排是单轴的,即只选择一个分区点并进行划分,双轴快排是选择两个分区点,并把排序数组分为3部分,然后再递归分,主要为了选择分区点选择为最大(小)值的情况导致的性能急剧下降,但仍解决不了连续性好时性能不佳的情况TimSort 算法实际上是对归并排序的一系列优化
从上面我们知道在排序节点在大于286时,切连续性好的情况下采用Timsort(归并排序)
我们知道归并排序有个非常大的问题:时间复杂度是O(n),那为什么还采用归并排序呢?
各种排序的时间复杂度与空间复杂度
java排序为什么采用归并排序
1、首先当排序数量大于286且连续性好(有序情况好)的时候才会采用Timsort,连续性不好还会使用双轴快排
2、如果连续性好的情况下用别管怎么选择分区点,快排时间复杂度都可能退化O(n²),所以这种情况要避免使用快排
3、Timsort就是针对这种连续性好的情况针对归并排序的优化,优化的方向如下:
1、Timsort是稳定的算法,当前排序的数组中已经有排序好的数,它的时间复杂度会小于O(nlogn)
2、最坏情况下Timsort算法需要的临时空间是n/2,在最好情况下,它只需要一个很小的临时存储空间
参考文档:https://www.jianshu.com/p/892ebd063ad9
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架