一文让你深入理解java中sort() 方法的底层原理,Collections.sort,Arrays.sort

总结整理不易,如果对你有所帮助,不妨动手点个免费的赞哦,收藏关注不迷路~
下一期将会对java中sort()方法的使用方法及规则进行全面的总结与探讨,敬请期待。

Java中的sort()方法是一个高效的排序算法,其具体的实现原理取决于排序的数据类型和大小。在Java 7之前,Arrays类使用的是经典的快速排序算法。在Java 7及以后的版本中,Arrays类在排序小型数组时使用的是改进后的快速排序算法,而在排序大型数组时使用的是归并排序算法

对于Collections.sort方法,其底层首先会将集合转换为数组,然后调用Arrays.sort方法对数组进行排序,排序完成后,Collections.sort()方法再将排序后的数组元素依次放回到原集合中,所以我们只分析Arrays.sort即可。 

对于Arrays.sort()方法,其主要使用了DualPivotQuicksort.sort方法

  1. 如果数组元素个数小于47个,那么使用改进的插入排序进行排序。插入排序的基本思想是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。

  2. 如果元素个数大于47个并且小于快速排序的阈值286个,则使用双轴快速排序进行排序。双轴快速排序是快速排序的一种改进,它选择两个枢轴进行排序,可以更有效地处理具有大量重复元素的数组。

  3. 如果数组的大小超过了快速排序的阈值,那么会使用归并排序。这是因为对于大规模的数据,归并排序的稳定性和效率往往更高。

DualPivotQuicksort.sort方法的具体实现包括以下步骤:

  • 判断数组大小:首先,根据数组的大小选择合适的排序算法。如果数组元素个数小于47个,那么使用插入排序进行排序。如果元素个数大于47个并且小于快速排序的阈值286个,则使用双轴快速排序进行排序。

  • 评估数组的无序程度。划分出有序序列个数越多,原数组越无序。理解注:比如数组完全有序只需要一个有序序列。

  • 如果数组基本无序,用快速排序代替归并排序。这是因为在这种情况下,快速排序的效率可能会更高。

  • 对于完全有序的数组,只能划分出1个有序数组。而一个完全逆序的数组,数组size有多大,就能划分出多少个有序数组。

  • 最后,使用归并排序。归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。归并排序的基本操作是:将两个或两个以上的有序表合并成一个新的有序表。

另:对于数据量大后不选用快排而用归并排序的解释:

这是因为快速排序的性能取决于枢轴元素的选择。在最坏的情况下,如果每次都选择最小(或最大)的元素作为枢轴,那么快速排序的时间复杂度将退化为O(n^2),其中n是数组的大小。这种情况通常发生在处理已经排序的数组时。

而归并排序的时间复杂度始终为O(n log n),无论数据的分布如何。因此,对于大规模的数据,归并排序通常更可靠,性能更稳定。

     ​

551a6c979a154dc6935e2d8205148a29.jpeg

   

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值