有效地合并两个数组 - 一个排序,另一个未排序

时间:2012-12-13 15:08:01

标签: arrays algorithm sorting data-structures

我正在处理一个问题,该问题包含n个元素的排序数组,后跟一个长度为

的未排序数组
  1. O(logn)时间
  2. O(SQRT(n))的
  3. 如何最有效地对整个列表进行排序?在上述两种情况下我应该使用哪种排序?

4 个答案:

答案 0 :(得分:5)

由于将单个元素插入数组并保持其排序为O(n),因此您无法做得更好。

因此,对于这两种情况 - 对较小的数组进行排序然后使用merge(part1,part2)将是O(n),因此在渐近复杂度方面是最优的。

  • 分别对较小的数组进行排序:O(logn*loglog(n))O(sqrt(n)*log(sqrt(n))
  • merge(part1,part2)O(n+logn)O(n+sqrt(n)),无论如何都是O(n) 1

因此,两个案例的总复杂度为O(n) ,这是此问题的最佳选择。


(1)这是真的,因为log(n)^k渐近地小于n^m k>0,m>0,特别是k=1, m=1/2
证明的依据是双方都记录日志:

log (log(n)^k) <? log(n^m) <=>
k*log(log(n)) <? m*log(n)

最后一个显然是正确的(对于大n和常数k,m>0),因此声明是正确的。 从此我们可以得出结论sqrt(n)*log(n) < sqrt(n) * n^1/2 = n,因此它确实是O(n)

答案 1 :(得分:5)

您可以简单地对未排序的数组进行排序,然后在这两个排序的数组上执行merge(如merge sort算法)。

答案 2 :(得分:3)

简单,排序第二部分并将其与第一部分合并(与合并排序相同)。两个排序子阵列的合并步骤是O(n)。

答案 3 :(得分:0)

假设part1part2分别为r O(log n)和O(sqrt(n))。因此,如果您从part2中选择一个元素并使用二进制搜索在日志(日志n)中找到part1中的位置,并以递归方式执行此操作,直到part2的元素不为空,总运行时间变为 O(sqrt(n)log(log n))。