【问题标题】:Fastest sort for small collections小集合的最快排序
【发布时间】:2011-08-09 09:24:02
【问题描述】:

很多时候我必须对大量的小列表、数组进行排序。我很少需要对大型数组进行排序。哪种排序算法最快:

  • 数组
  • (数组)列表

这些类型的大小为 8-15 的元素:

  • 整数
  • 10-40 个字符的字符串

?

我列出元素类型是因为某些算法执行的比较操作较多,交换操作较少。

我正在考虑合并排序、快速排序、插入排序和外壳排序(2^k - 1 个增量)。

【问题讨论】:

    标签: java sorting collections


    【解决方案1】:

    Arrays.sort(..) / Collections.sort(..) 将为您做出决定。

    例如,openjdk-7 implementation of Arrays.sort(..) 具有 INSERTION_SORT_THRESHOLD = 47 - 它对少于 47 个元素的元素使用插入排序。

    【讨论】:

    • 没错,对于小型馆藏,效率上的差异在现代机器上几乎不明显。
    • 我期待答案是“没关系”。当服务器每秒处理几十个请求且每个请求有几十个时,这确实很重要。合并排序会产生大量分配,从而使垃圾收集器更加努力。 Sun/Oracle Java 6 实现中的这个插入排序阈值吗?如果没有,它对我帮助不大。
    • 您可以检查 Java 6 代码以了解确切的阈值。但算法是很久以前指定的,所以我预计不会有任何重大差异。
    • 检查了我的特定实现 (IBM java 6) - 阈值为 7。
    【解决方案2】:

    除非你能证明这是一个瓶颈,否则内置排序就可以了:

    Collections.sort(myIntList);
    
    Arrays.sort(myArray);
    

    【讨论】:

      【解决方案3】:

      实际上,没有一个通用的答案。除其他事项外,Java 排序算法的性能将取决于比较操作的相对成本,以及(对于某些算法)输入的顺序。如果是列表,还取决于列表的实现类型。

      但是@Bozho 的建议是合理的,@Sean Patrick Floyd 的评论也是如此。


      跟进

      如果您认为性能差异对您的用例来说很重要,那么您应该掌握不同算法的一些实现,并使用您的应用程序需要处理的实际数据对其进行测试。 (如果您还没有数据,现在开始调整应用程序还为时过早,因为排序性能将取决于实际数据。)

      简而言之,您需要自己进行基准测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 2021-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多