我必须回答以下问题:
如果第一个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),我会说。
有没有人有想法或能给我一些建议?
问候
答案 0 :(得分:2)
您是否尝试将剩余部分m
单独排序作为O(m log (m))
复杂度(使用您喜欢的任何算法:MergeSort,HeapSort,QuickSort,...)然后使用MergeSort合并该部分与已排序部分(您甚至不需要完全实现MergeSort - 只需单个传递它的内部循环体来合并两个已排序的序列)?
这将导致O(m*log(m) + n + m) = O(m*log(m) + n)
复杂性。我不相信有可能在单核CPU上找到更好的渐近复杂性。虽然它需要额外的O(n+m)
内存来合并结果数组。
答案 1 :(得分:0)
Which sort algorithm works best on mostly sorted data?
听起来像插入和泡泡都很好。您可以自由地实现任意多个,然后通过提供部分排序的数据来测试哪些操作更快/更少。