【发布时间】:2015-08-26 19:04:44
【问题描述】:
我在 Internet 上搜索以查找哪种排序算法最适合非常大的数据集。我发现许多人认为合并排序是最好的,因为它是公平的,并且它确保时间复杂度为 O(n log n) 并且快速排序不安全:快速排序的变体也可以不安全,因为真实的数据集可以是任何东西。
如果交换两个元素的时间成本可以忽略不计,那么为什么我们不能选择堆排序作为这种情况下的最佳排序算法,因为它和 O(n log n) 一样到位?
在合并排序的情况下,它需要另一个 O(n) 空间;如果数据非常大,我们就不能使用这个算法。
请告诉我:在这种情况下哪种算法应该是最好的?
【问题讨论】:
-
“非常大”相当模糊。
-
链表上的合并排序占用固定空间并且仍然是稳定的,因此您对空间的担忧可能无效。它还可以很好地处理文件,并且可以利用多个处理器。
-
sorting-algorithms.com 有趣地展示了所涉及的一些变量和权衡。
-
@erickson 它真的使用 O(1) 辅助空间吗?我认为您需要 O(log n) 空间来存储调用堆栈。
-
@templatetypedef 不,这是一个 O(1) 空间的迭代算法。只需几个指针和几个计数器。