我有2个排序的数组A [],B []。我的要求是合并这2个排序的数组,结果数组也应该是排序的方式。由于有2个排序数组,我有2个方法来解决这个问题。一个是使用MERGE SORT方法我可以排序&另一个我建议只是加入这两个数组并通过快速排序方法对结果数组进行排序。
我的问题在于以上两种方法,哪种方法效率更高,运行时间更短,更稳定。请给我建议&如果有任何其他解决方案可用,请告诉我。
答案 0 :(得分:4)
使用预先排序的数组,最简单的方法应该是
int A[50];
int B[50];
int C[100];
std::merge(std::begin(A), std::end(A), std::begin(B), std::end(B), std::begin(C));
或者如果你正在使用std::array
s
std::array<int, 50> A;
std::array<int, 50> B;
std::array<int, 100> C;
std::merge(A.begin(), A.end(), B.begin(), B.end(), C.begin());
答案 1 :(得分:1)
合并两个预先排序的数组只需要O(N)
时间和O(N)
额外空格N = n + m
。这里n
和m
是每个数组中元素的数量。
在上述情况下,如果两个数组最初未排序,则必须分别在O(nlogn)
和O(mlogm)
时间对它们进行排序。然后合并它们需要另外O(N)
时间,从而渐渐地导致总O(max(m, n) log max(m, n))
次。
另一方面,如果你加入这两个数组并应用任何第一个排序算法,如quicksort(C ++&#39; s sort(..)
),时间复杂度将是O(NlogN)
和{ {1}}额外的空间。
所以它的时间复杂度,我认为你应该使用合并排序的合并方法,因为你的两个数组最初是排序的。
答案 2 :(得分:0)
不使用类,即纯C:
void merge(int A[], int B[], int C[])
{
int a, b, c;
a= b= c= 0;
while (a<50 && b<50) {
if (A[a] < B[b])
C[c++]= A[a++];
else C[c++]= B[b++];
}
while (a<50) C[c++]= A[a++];
while (b<50) C[c++]= B[b++];
}