【问题标题】:What is the most performant algorithm for sorting array elements?对数组元素进行排序的性能最高的算法是什么?
【发布时间】:2011-07-17 16:00:35
【问题描述】:

我正在解决 UVa 站点问题,我有一个问题是我必须尽可能快地对整数进行排序

我尝试过冒泡排序,但效率低下。我尝试了使用递归的快速排序,但结果为StackOverflowException,因为输入非常大(几乎 2000 万)。

问题的时间限制只有 5 秒。有人对如何更有效地实现这一点有任何想法吗?

【问题讨论】:

  • 如果输入是这样的,你的问题应该有一个更简单的算法。无需排序或有约束地排序。你能给出那个问题的ID吗?
  • 一个正确编写的递归快速排序,只需要使用O(log N)堆栈。约束必须非常严格才能防止这种处理 20M 元素。您可以通过在较小的分区上调用递归并循环执行较大的分区来做到这一点,因此您的函数只是单递归的。请参阅stackoverflow.com/q/6709055/13005 了解为什么会这样。只有乘递归快速排序需要风险O(n) 堆栈深度。
  • 您是否尝试使用随机枢轴进行快速排序?正如史蒂夫杰索普所说,一个写得很好的快速排序只能递归到 O(log(n)) 的深度。此外,UVa 不会禁止您使用随您的语言提供的任何内置排序算法。您应该查看 C++ 中的 std::sort、Java 中的 Arrays.sort 或 C 中的 qsort
  • @MAK:我用的是C++,但是没有std::sort类存在?!

标签: performance algorithm sorting language-agnostic


【解决方案1】:

您不一定需要递归地编写快速排序。

您可以采用递归算法,并将其重写为使用堆栈,从而避免递归。

这个例子的实现:

【讨论】:

    【解决方案2】:

    我将支持您认为非比较排序的建议。你说你正在对整数进行排序......具体的整数范围是什么,允许值落在其中?计数/桶排序会很快。

    【讨论】:

      【解决方案3】:

      我使用 C 和 qsort() 函数解决了这个问题,试一试。

      【讨论】:

      • 所以你对算法问题的回答是“使用别人写的这个函数?”
      • 这是 UVa,你不需要重新发明轮子来解决大多数问题(我已经解决了 200 多个问题),你可以尽你所能。
      • 如果想了解这些算法的工作原理,那么重点就是重新发明轮子。在这种情况下,打电话给qsort 只会告诉你这个人真的很聪明。
      • 他没有要求解释,他只是想知道如何快速完成,我只是告诉他我用来解决这个问题的方法,这里还有很多其他答案有排序方法的链接和说明。
      • 我认为大多数人都没有意识到这是一个 UVa 问题。您应该将标准库用于此类简单的事情(更难的问题仍然需要大量的算法知识)
      【解决方案4】:

      由于您只对整数进行排序,radix sort 可能是个好主意。这个算法的好处是它总是花费相同的时间,这取决于要排序的元素数量,而不是它们的“未排序”程度。

      另请参阅 Donald Knuth 的计算机编程艺术第 3 卷,排序和搜索。该算法在5.2.5 节中描述。按分布排序,从第 168 页开始。算法的伪代码是第 172 页的算法 R(第二版的页码)。

      该算法不仅效率很高,而且我认为它易于理解和实现(嗯​​,至少对于排序算法而言)。

      【讨论】:

        【解决方案5】:

        快速排序可以写成in-place。由于它不需要(嗯,不多)额外的内存,我认为如果你使用这个版本它不会导致错误。如果你仍然有这种错误,你可以考虑随机化输入。

        另外,您可以考虑非比较排序,例如counting sort。这类排序算法有其自身的局限性,但通常需要较少的时间,例如 O(n)。

        【讨论】:

        • 如果以递归方式编写,即使是就地快速排序也可能溢出堆栈。堆栈有一定的最大深度,因此限制因素是递归调用的深度,它与就地算法无关。
        【解决方案6】:

        使用 Timsort:http://en.wikipedia.org/wiki/Timsort

        这不可能解决您的 StackOverflow。您可以使用堆栈迭代地实现它们。

        【讨论】:

        • 在我看来,Timsort 的文档记录非常糟糕。我尝试实现很多不同的排序算法,它在我的待办事项列表中。但是,我还没有找到一个准确、简洁的规范来说明它是如何工作的。
        猜你喜欢
        • 2011-11-27
        • 2023-04-10
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多