哪种算法在 Stream 接口中使用排序方法[关闭]

2024-02-11

当我打印排序方法中的值时,

Stream.of("d", "a", "b", "e", "c", "f")
    .sorted((s1, s2) -> {
        System.out.printf("sort: %s - %s\n", s1, s2);
        return s1.compareTo(s2);
    }).forEach(System.out::println);

输出如下;

sort: a - d
sort: b - a
sort: b - d
sort: b - a
sort: e - b
sort: e - d
sort: c - d
sort: c - b
sort: f - c
sort: f - e
a
b
c
d
e
f

我无法理解这里排序算法的逻辑。任何帮助将不胜感激。


下面的答案与 OpenJDK 相关(对照 10.0.1 检查)。

Streams将排序操作委托给相关的Arrays.sort方法(参见end各种方法SortingOps).

对对象流进行排序

对于对象排序,TimSort(基本上,当输入的划分足够小时,使用插入排序的合并排序)是首选方法。

作者信用Tim Peter 在 Python 中实现列表排序作为灵感 http://svn.python.org/projects/python/trunk/Objects/listsort.txt,进一步将这个想法归因于论文"Optimistic Sorting and Information Theoretic Complexity", Peter McIlroy, SODA (Fourth Annual ACM-SIAM Symposium on Discrete Algorithms), 467-474, Austin, Texas, 25-27 January 1993.

但是用户也可以请求MergeSort(当数组足够小时,回退到插入排序 - 在 OpenJDK 10 中为 32 个或更少的元素)通过设置java.util.Arrays.useLegacyMergeSort财产给true。计划在未来版本中删除此内容。

对原语流进行排序

用于对基元流进行排序(byte, char, short, int, long, float, double) - 实现了双枢轴快速排序。作者(弗拉基米尔·雅罗斯拉夫斯基、乔恩·本特利和乔什·布洛赫)没有提供有关灵感来源的更多信息。

Sources

要了解更多信息,请参阅 OpenJDK 代码:

  • SortedOps.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/stream/SortedOps.java- 与流相关的实现

  • 数组.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/Arrays.java- 实施Arrays帮手看看不一样的sort methods

  • TimSort.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/TimSort.java- TimSort 的实现

  • 比较TimSort.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/ComparableTimSort.java- 类实施的变化Comparable

  • DualPivotQuicksort.java http://hg.openjdk.java.net/jdk/jdk10/file/b09e56145e11/src/java.base/share/classes/java/util/DualPivotQuicksort.java- 实现原语排序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪种算法在 Stream 接口中使用排序方法[关闭] 的相关文章

随机推荐