https://www.cnblogs.com/baichunyu/p/11935995.html

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

https://assets.cnblogs.com/images/copycode.gif

1 // Use Quicksort on small arrays
2 if (right - left < QUICKSORT_THRESHOLD)
3 {
4        //QUICKSORT_THRESHOLD = 286
5         sort(a, left, right, true);
6         return;
7  }

https://assets.cnblogs.com/images/copycode.gif

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

https://assets.cnblogs.com/images/copycode.gif

1 // Use insertion sort on tiny arrays
2 if (length < INSERTION_SORT_THRESHOLD)
3 {
4     if (leftmost)
5     {
6         ......

https://assets.cnblogs.com/images/copycode.gif

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

https://assets.cnblogs.com/images/copycode.gif

 1 /*
 2  * Traditional (without sentinel) insertion sort,
 3  * optimized for server VM, is used in case of
 4  * the leftmost part.
 5  */
 6 for (int i = left, j = i; i < right; j = ++i)
 7 {
 8      int ai = a[i + 1];
 9      while (ai < a[j])
10      {
11           a[j + 1] = a[j];
12           if (j-- == left)
13           {
14                break;
15            }
16       }
17       a[j + 1] = ai;

https://assets.cnblogs.com/images/copycode.gif

https://img2018.cnblogs.com/i-beta/1701765/201911/1701765-20191126153628728-443534100.png

元素少于47用插入排序

至于大过INSERTION_SORT_THRESHOLD(47)的,用一种快速排序的方法:

1.从数列中挑出五个元素,称为 “基准”(pivot);

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。