部分排序序列的最佳排序算法?

Best sorting algorithm for a partly sorted sequence?

我必须回答以下问题:

如果第n-m部分推荐什么排序算法
已经排序而剩余部分 m 未排序?是否有任何算法可以进行 O(n log m) 比较? O(m log n) 比较怎么样?

我就是找不到解决办法。

我的第一个想法是插入排序,因为 O(n) 对于几乎已排序的序列。但是由于我们不知道 m 的大小,运行时很可能是 O(n^2) 即使序列已经排序一半了不是吗?

然后我认为它可能是快速排序,因为它需要(从 k=1 到 n 的总和)Cavg (1-m) + Cavg (n-m) 比较。但是在忽略序列的 n-m 部分之后,剩余的序列在快速排序中是 1-m 而不是 m.

合并排序和堆排序应该有 O(m log m) 的运行时间,我会说剩下的序列 m。

有没有人有想法或可以给我一些建议?

问候

Which sort algorithm works best on mostly sorted data?

插入和气泡听起来不错。您可以自由实施任意数量的操作,然后通过提供部分排序的数据来测试 faster/fewer 操作。

您是否尝试过将剩余部分 m 单独排序O(m log (m)) 复杂度(使用您喜欢的任何算法:MergeSort、HeapSort、QuickSort,... ) 然后 merge 使用 MergeSort 排序的部分(您甚至不需要完全实现 MergeSort - 只需单次传递它的内部循环体即可合并两个排序序列)?

这会导致 O(m*log(m) + n + m) = O(m*log(m) + n) 复杂。我认为不可能在单核 CPU 上找到更好的渐近复杂度。尽管合并结果数组需要额外的 O(n+m) 内存。