部分排序序列的最佳排序算法?
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)
内存。
我必须回答以下问题:
如果第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)
内存。