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

时间:2018-05-14 08:08:34

标签: algorithm sorting time complexity-theory

我必须回答以下问题:

如果第一个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),我会说。

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

问候

2 个答案:

答案 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?

听起来像插入和泡泡都很好。您可以自由地实现任意多个,然后通过提供部分排序的数据来测试哪些操作更快/更少。