Java中自带的sort方法原理解析

排序问题是算法里面的经典问题,也是计算机学科数据结构课程里面的必修课,面对诸多的如插入排序,快速排序,堆排序,归并排序等等经典排序算法,

sort()是Java中用来排序的一个方法,在我们专心学习各种经典排序算法的时候,其实在代码中一个sort()就可以解决。

我们经常使用的对数据进行排序的算法Arrays.sort,Collections.sort方法,那么JDK的实现者是如何选择排序算法的呢?这是一个常见的面试问题。

事实上Collections.sort方法底层就是调用的Arrays.sort方法,所以我们只分析Arrays.sort就好。

Arrays.sort(int[])方法来概述基本类型排序的基本思路如下:

  • 如果数组元素个数小于47个,那么使用改进的插入排序进行排序
  • 如果元素个数大于47个并且小于快速排序的阈值286个,则使用双轴快速排序进行排序
  • 如果元素个数大于286个,根据数组的无序程度来判定继续使用哪种算法,无序程度通过将数组划分为不同的有序序列的个数来判定。
  • 如果有序序列的个数大于67个,则认为原数组基本无序,则仍然使用双轴快速排序,如果小于67个,则认为原数组基本有序,使用归并排序进行排序。

也就是说,划分出有序序列个数越多,其实原数组是越无序的。这里理解不了的同学,可以往极限想一下。一个完全有序的数组,只能划分出1个有序数组。而一个完全逆序的数组,数组size有多大,就能划分出多少个有序数组。

若果是Arrays.sort(Object object),会涉及稳定性的问题。因为快排是是不稳定的,所以当数组个数超过插入排序的阈值后,不会使用快排,而是使用归并排序。

这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Arrays.sort()` 方法Java 标准库的一个静态方法,用于对数组进行排序。它使用了一种名为“快速排序”的算法来进行排序。下面是 `Arrays.sort()` 方法的一般流程: 1. 如果数组元素个数小于 7,则使用插入排序算法进行排序。 2. 否则,选择一个枢轴元素(pivot),并将数组分割成两个部分,其一个部分的元素都小于等于枢轴元素,另一个部分的元素都大于等于枢轴元素。 3. 对于两个部分分别进行递归排序,直到每个部分的元素个数小于 7。 4. 递归结束后,对整个数组进行一次插入排序。 下面是具体的实现细节: 1. 首先,将待排序数组的第一个元素作为枢轴元素(pivot)。 2. 定义两个指针 i 和 j,分别指向数组的第一个和最后一个元素。 3. 从右向左遍历数组,找到第一个小于等于枢轴元素的元素,将其与枢轴元素交换,并将 i 指针后移一位。 4. 从左向右遍历数组,找到第一个大于等于枢轴元素的元素,将其与枢轴元素交换,并将 j 指针前移一位。 5. 重复步骤 3 和步骤 4,直到 i 和 j 相遇。 6. 将枢轴元素与相遇位置的元素交换,此时枢轴元素左边的元素都小于等于枢轴元素,右边的元素都大于等于枢轴元素。 7. 对枢轴元素左边的子数组和右边的子数组分别进行递归排序,直到每个子数组的元素个数小于 7。 最后,对整个数组进行一次插入排序,以保证排序的稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值