我正在解决UVa网站问题,我有一个问题,我必须尽可能快地对整数进行排序。
我尝试过冒泡排序,但效率很低。我尝试过快速排序,它使用递归,但结果是StackOverflowException
,因为输入非常大(差不多20百万)。
问题的时间限制仅为 5秒。有没有人对如何更有效地实现这个有任何想法?
答案 0 :(得分:3)
您不一定需要递归编写quicksort。
你可以采用递归算法,然后重写它以使用堆栈,避免递归。
此示例实现:
答案 1 :(得分:3)
我使用C和qsort()函数解决了这个问题,试一试。
答案 2 :(得分:3)
我会考虑你考虑非比较排序的建议。你说你正在排序整数......特别是整数范围是允许落入内部的值?计数/桶排序会非常快。
答案 3 :(得分:2)
Quicksort可以写成in-place。由于它不需要(嗯,不多)额外的内存,我不认为如果你使用这个版本会导致错误。如果你仍然有这种错误,你可以考虑随机输入。
此外,您可以考虑非比较排序,例如counting sort。这些排序算法有其自身的局限性,但通常需要较少的时间,例如O(n)。
答案 4 :(得分:2)
由于您只对整数进行排序,radix sort可能是个好主意。这个算法的优点在于它总是占用相同的时间量,这取决于要排序的元素数量,而不是它们是如何“未排序”的。
另请参阅Donald Knuth的计算机编程艺术第3卷,排序和搜索。该算法在 5.2.5节中描述。按分布排序,从第168页开始。算法的伪代码是算法R ,第172页(第二版的页码)。
算法不仅效率很高,而且我认为它很容易理解和实现(至少对于排序算法而言)。
答案 5 :(得分:1)
使用Timsort:http://en.wikipedia.org/wiki/Timsort
哪个不可能解决你的StackOverflow。您可以使用堆栈迭代地实现它们。