【问题标题】:Optimizing Mergesort优化合并排序
【发布时间】:2012-09-17 10:09:35
【问题描述】:

合并排序是一种相当常见的排序算法,我已经编写了一个有效的合并排序算法。然后我想优化它。第一步是将它从递归转换为迭代,我这样做了。然后我无法辨别还有什么可以优化的。在网上浏览了很多文章后,我得到了两种机制,使用multi-merge排序和平铺合并排序。然而,这些文档都没有提供任何伪代码,甚至都没有解释如何做到这一点,以及它如何提供作者所说的优势,比如缓存友好和改进的局部性命中。

谁能详细说明这个问题,如果可能的话,提供一些伪代码?具体来说,我想知道如何使它对缓存友好。我完全不知道这些东西是什么,否则我会自己尝试的。

【问题讨论】:

  • 如果你想谦虚,看看 Timsort。这是一种合并排序,但它充满了疯狂聪明的优化。
  • 是的,我会调查的。但是 Wiki 文章告诉它本身可能很复杂,所以也没有太多运气。我想知道的是如何使排序算法对缓存友好...
  • 这很复杂,但至少有据可查。至于缓存友好性,如果这是您的问题,请说得更清楚。它基本上归结为使代码按照 CPU 缓存擅长优化的顺序访问内存。

标签: algorithm sorting mergesort divide-and-conquer


【解决方案1】:

您可以进行的一个常见且相对简单的优化是当子数组大小低于某个阈值时,从合并排序切换到另一种算法,如插入排序。尽管归并排序在 O(n log n) 的时间内运行,但它谈到了它的长期增长率,并没有说明算法在小输入上的表现如何。例如,插入排序在较小的输入大小上运行得非常快,尽管从长远来看它会更糟。因此,请考虑更改合并排序的基本情况,以便如果要排序的数组低于某个大小阈值(例如,50-100),则使用插入排序而不是继续递归。根据经验,这可以显着提高算法的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多