bucket sort sample sort 并行_Java中Arrays的两种排序方法(sort和parallelSort)比较

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

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

0.摘要

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

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

a3679fc717b439074e6971a7dea39228.png

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);
}

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

9569ba2f96aae1661bb2241a1c91bbe9.png

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快速排序算法。否则,它使用并行排序。

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

84e09311f95baea6333509288ccf8a67.png

两者比较

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

4be53c1b4cd01c24d7aa54158918f36c.png

方法性能测试对照

总结

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

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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值