暂时网上看过很多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

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

被折叠的 条评论
为什么被折叠?



