程序员的知识教程库

网站首页 > 教程分享 正文

Java中Arrays的两种排序方法(sort和parallelSort)比较

henian88 2024-10-11 12:08:54 教程分享 55 ℃ 0 评论

本文由@牛旦教育IT课堂原创翻译

原文:https://www.baeldung.com/java-arrays-sort-vs-parallelsort

0.摘要

我们都用过Array.sort()来对对象或基本类型数组进行排序。在JDK 8中,增强的API来提供一个新方法:Arrays.parallelSort()。

本教程中,我们来比较sort()和parallelSort()方法的具体情况。



1.Arrays.sort()

Arrays.sort()方法对数组对象或基本类型排序,其基本算法是Dual-Pivot Quicksort(对称快速排序)。换句话说,它是快速排序算法的自定义实现,以获得更好的性能。

这个方法是单线程的,它有两个辩题方法:

  • l sort(array) – 将整个数组按升序排序
  • l sort(array, fromIndex, toIndex) – 只对从fromIndex到toIndex的元素排序

来看两个变体方法的代码示例:

@Test
public void givenArrayOfIntegers_whenUsingArraysSortMethod_thenSortFullArrayInAscendingOrder() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    Arrays.sort(array); 
    assertArrayEquals(expected, array); 
}
 
@Test
public void givenArrayOfIntegers_whenUsingArraysSortWithRange_thenSortRangeOfArrayAsc() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 }; 
    Arrays.sort(array, 2, 8); 
    assertArrayEquals(expected, array);
}

简要总结一下这种方法的利弊:


Arrays.parallelSort()

此方法也可对对象或基本类型数组进行排序。与sort()类似,它也有两个变体排序方法,以实现对全数组和部分数组排序,来看两个示例:

@Test
public void givenArrayOfIntegers_whenUsingArraysParallelSortMethod_thenSortFullArrayInAscendingOrder() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    Arrays.parallelSort(array); 
    assertArrayEquals(expected, array);
@Test
public void givenArrayOfIntegers_whenUsingArraysParallelSortWithRange_thenSortRangeOfArrayAsc() {
    int[] array = { 10, 4, 6, 2, 1, 9, 7, 8, 3, 5 };
    int[] expected = { 10, 4, 1, 2, 6, 7, 8, 9, 3, 5 }; 
    Arrays.parallelSort(array, 2, 8); 
    assertArrayEquals(expected, array);
}

方法parallelSort()在功能上与前者是不同的。也就是说,与使用单个线程对数据进行顺序排序的sort()不同,它使用并行的sort-merge(合并排序)算法。它将数组拆分成子数组,子数组本身进行排序,然后合并。

对于执行的并行任务,它使用ForkJoin池。

但是我们要知道,它只在满足特定条件时才使用并行特性。如果数组大小小于或等于8192,或者处理器只有一个核心,那么它使用顺序Dual-Pivot快速排序算法。否则,它使用并行排序。

总结一下此种排序的利弊:



两者比较

现在让我们看看这两个方法在不同大小的数据集上是如何执行的。下面的数字是使用JMH基准(https://www.baeldung.com/java-microbenchmark-harness测试得出的。测试环境使用AMD A10 PRO 2.1Ghz四核处理器和JDK 1.8.0_221:



总结

本篇短文中,我们了解了sort()和parallelSort()的区别。

根据性能结果,我们可以得出结论,当需要对大型数据集进行排序时,parallelSort()可能是更好的选择。但是,对于较小大小的数组,最好使用sort(),因为它提供了更好的性能。

好了,本就到这里,各位具体使用中,根据自己的实际需要取舍吧。

点个赞,分享出去吧。^_^




Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表