【发布时间】: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