如何以最有效的方式将两个未排序的数组合并成一个排序的数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以最有效的方式将两个未排序的数组合并成一个排序的数组?相关的知识,希望对你有一定的参考价值。

假设我们有两个数组。

A[] = {7, 15, 2};     //*Size: n* 

B[] = {5, 96, 15};    //*Size: m*

而我们想得到 c[] = {2, 5, 7, 15, 15, 96}.

我有一个天真的方法。第一次对两个数组进行排序 AB 然后将它们合并,得到 c.

时间复杂度 : O (nlogn + mlogm + (n + m))

空间复杂度 : O ( (n+m) )

但是有没有一种有效的方法呢?

答案

我有一个天真的方法:第1次将两个数组A...进行排序。 它不能做得更好,因为这将意味着排序速度比 O(nlogn) 为一般情况下的排序。(就渐进时间复杂度而言)

首先,注意这里。O(nlogn + mlogm) = O((n+m)log(n+m)

在不失一般性的情况下, n <= m (否则只需切换数组)。

nlogn + mlogm <= (n+m)log(n+m) + (n+m)log(n+m) = 2(n+m)log(n+m)
which is in O((n+m)log(n+m))
(n+m)log(n+m) <= 2n*log(2n) <= 2n*log(2n) + 2m*log(2m) <= 2(nlog(n) +mlog(m) + nlog(2) + mlog(2))
which is in O(nlogn + mlogm)

这意味着,建议的方法,在渐进时间复杂度上,并不比合并数组和排序后再做这个更好。

现在,假设这可以在 O(f(n,m)) 哪儿 f(n) 是在 o((n+m)log(n+m)) (这里用小o符号表示)。这意味着,对于任何给定的数组--你可以把它拆成两个数组,然后运行建议的算法。这本来就和排序是一个矛盾的事实。Omega(nlogn) 问题。

以上是关于如何以最有效的方式将两个未排序的数组合并成一个排序的数组?的主要内容,如果未能解决你的问题,请参考以下文章

美团一面:如何高效地将两个有序的数组合并成一个有序数组

C练习两个已经从小到大的数组合并成为一个从小到大排序的数组

算法导论:归并排序

排序之归并排序

排序算法详解

Java中如何把两个数组合并为一个