我正在处理一个问题,该问题包含n个元素的排序数组,后跟一个长度为
的未排序数组如何最有效地对整个列表进行排序?在上述两种情况下我应该使用哪种排序?
答案 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)
假设part1
和part2
分别为r O(log n)和O(sqrt(n))。因此,如果您从part2
中选择一个元素并使用二进制搜索在日志(日志n)中找到part1
中的位置,并以递归方式执行此操作,直到part2
的元素不为空,总运行时间变为 O(sqrt(n)log(log n))。