Java的排序Arrays.sort和Arrays.parallelSort

  • Arrays.sort

Arrays.sort来对原生数组进行排序,这个API会使用归并排序或者Tim排序(  Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率)来进行排序。

  • Timsort的核心过程

1、数组个数小于32的情况使用二分插入排序

2、数组大于32时, 先算出一个合适的大小,在将输入按其升序和降序特点进行了分区。排序的输入的单位不是一个个单独的 数字,而是一个个的块-分区。其中每一个分区叫一个run。针对这些 run 序列,每次拿一个run出来按规则进行合并。每次合并会将两个run合并成一个 run。合并的结果保存到栈中。合并直到消耗掉所有的run,这时将栈上剩余的 run合并到只剩一个 run 为止。这时这个仅剩的 run 便是排好序的结果。

       Timsort是稳定的算法,当待排序的数组中已经有排序好的数,它的时间复杂度会小于nlogn。与其他合并排序一样,Timesort是稳定的排序算法,最坏时间复杂度是O(n log n)。在最坏情况下,Timsort算法需要的临时空间是n/2,在最好情况下,它只需要一个很小的临时存储空间。

  • Arrays.ParallelSort

      Java8出来之后,有一个新API用来进行排序,这就是Arrays.ParallelSort,这是一种并行排序。

      Arrays.ParallelSort使用了Java7的Fork/Join框架使排序任务可以在现场池中的多个线程中进行,Fork/Join实现了一种任务窃取算法,一个闲置的线程可以窃取其他线程的闲置任务进行处理。

  • Arrays.parallelSort概述

一旦数组决定了使用并行排序,那他马上会被分为几个部分,然后通知Fork/Join任务对各个部分进行排序,跟着通知另外的Fork/Join任务对排序后的数组进行合并。

Java8使用如下的方法进行实现:

1、将数组分成4个子数组。

2、对前面两个子数组进行排序然后合并。

3、对后面的两个进行排序然后合并。

上面着几个步骤会重复递归,每个子数组都要求容量小于上面计算出来的临界值。

  • 性能对比

Java的排序Arrays.sort和Arrays.parallelSort_第1张图片

在数组容量小于10000的情况下,并行排序和串行排序消耗时间是差不多的,但是当数组容量在10000以上的时候,并行排序就体现出了它的优势。

你可能感兴趣的:(排序算法)