繁体   English   中英

合并然后排序,还是先排序然后合并,它更快吗?

[英]Is it faster to merge and then sort, or sort and then merge?

我有2个未排序的数组。 分别对它们进行排序然后合并它们会更快吗? 还是先连接数组然后对合并的巨大数组进行排序会更快?

假设在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 ,那么整个讨论都没有意义

显然,big-O在这个问题上并没有说什么。 假设您使用的算法是quicksort。 平均运行时间为:

在此处输入图片说明

所以现在,如果排序然后合并,我们得到:

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,则排序然后合并将更快。

我认为这将取决于排序算法和数据的大小。

但是一个大胆的猜测是,合并然后对整个批次进行排序是更可取的。 因为在这种情况下,合并只是追加。

而在其他情况下,您需要应用排序合并。

如果保证第二个数组中的所有条目都大于第一个数组中的所有条目,则可以在对每个数组进行排序后将它们连接起来。 每种排序算法的复杂性都比线性算法差,因此,当您可以将排序任务分解为可以单独排序的子集时,就应该这样做。

但是,当合并数组后需要再次对条目进行排序时,事先对每个数组进行排序不太可能使其更快。

当您想确切地了解它时,请创建大量测试数据并自己评估性能。

这取决于您使用的技术。

首先排序,然后合并,将在现代多处理器体系结构上为您带来更好的结果,在该体系结构中,您可以在两个并行线程中的两个数组上对O(nlogn) (但常数要小得多O(nlogn)运行排序算法,然后将它们合并到O(n)时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM