解析JDK8中Arrays.sort底层原理及其排序算法的选择

博客详细解析了JDK8中Arrays.sort的底层实现,指出其并非单纯的快速排序,而是结合了插入排序、快速排序和归并排序。对于小于47个元素的数组,使用插入排序;大于47且小于286个元素的数组,使用快速排序;超过286个元素的数组,会通过结构判断决定是否采用归并排序。此外,文章还讨论了各种排序算法的时间复杂度和稳定性特点。
摘要由CSDN通过智能技术生成

暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序。。。其实不全对。让我们对着源码分析个究竟:

 // Use Quicksort on small arrays
 if (right - left < QUICKSORT_THRESHOLD) {//QUICKSORT_THRESHOLD = 286
    sort(a, left, right, true);
    return;
}

数组一进来,会碰到第一个阀值QUICKSORT_THRESHOLD(286),注解上说,小过这个阀值的进入Quicksort (快速排序),其实并不全是,点进去sort(a, left, right, true);方法能看见:

 // Use insertion sort on tiny arrays
        if (length < INSERTION_SORT_THRESHOLD) {//INSERTION_SORT_THRESHOLD=47
            if (leftmost) ……

我们看到第二个阀值INSERTION_SORT_THRESHOLD(47),如果元素少于47这个阀值,就用插入排序,往下看确实如此:

 				/*
                 * Traditional (without sentinel) insertion sort,
                 * optimized for server VM, is used in case of
                 * the leftmost part.
                 */
                for (int i = left, j = i; i < right; j = ++i) {
                    int ai = a[i + 1];
                    while (ai < a[j]) {
                        a[j + 1] = a[j];
                        if (j-- == left) {
                            break;
                        }
                    }
                    a[j + 1] = a
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值