我有2个未排序的数组。将它们单独排序然后合并它们会更快吗?或者首先连接数组并对组合的巨大数组进行排序会更快吗?
答案 0 :(得分:7)
假设在O(1)
中进行了连接,合并需要O(n)
和排序O(n log n)
,您可以选择:
O(n log n) + O(n) = O(n log n)
O(1) + O((2n) log (2n)) = O(n log n)
当然,如果您使用MergeSort ,整个讨论都没有实际意义。
答案 1 :(得分:4)
所以现在,如果排序然后合并,我们得到:
f1 = 1.39n * log(n)* 2 + 2n
合并然后排序:
f2 = n + 1.39 * 2n * log(2n)
区别在于
f2-f1 = -n + 2.78n> 0
在一般情况下,如果排序算法具有复杂性
C = k * nlog(n)
那么因为k通常应该大于1,并且不太可能接近0.5,所以如果假设合并成本最多为2n,那么合并将会更快。
答案 2 :(得分:0)
我认为这取决于排序算法和数据的大小。
但是一个疯狂的猜测是合并然后整理整个批次是可取的。因为在这种情况下合并只是附加。
在另一种情况下,您需要应用排序合并。
答案 3 :(得分:0)
当保证第二个数组中的所有条目都大于第一个数组中的所有条目时,可以在对每个数组进行排序后连接数组。每个排序算法的复杂性都比线性更差,所以当你可以将排序任务分解为可以单独排序的子集时,你应该这样做。
但是当合并数组后需要再次对条目进行排序时,事先对每个数组进行排序不太可能使这更快。
如果您想完全了解它,请创建一大组测试数据并自行衡量性能。
答案 4 :(得分:0)
这取决于您使用的技术。
首先进行排序然后合并将在现代多处理器体系结构上提供更好的结果,在这种体系结构中,您可以在O(nlogn)
周围的并行线程中运行两个数组上的排序算法(但具有更小的常量)然后合并它们在O(n)
时间。