给定两个排序数组,任务是以排序方式合并它们。
例子:
Input: arr1[] = { 1, 3, 4, 5}, arr2[] = {2, 4, 6, 8}
Output: arr3[] = {1, 2, 3, 4, 4, 5, 6, 8}
Input: arr1[] = { 5, 8, 9}, arr2[] = {4, 7, 8}
Output: arr3[] = {4, 5, 7, 8, 8, 9}
方法1(O(n1 * n2)时间和O(1)额外空间)
- 创建大小为n1 + n2的数组arr3 []。
- 将arr1 []的所有n1个元素复制到arr3 []
- 遍历arr2 []和arr3 []到arr1 []的一对一插入元素(如插入排序)。此步骤需要O(n1 * n2)时间。
我们已经讨论了以上方法的实现在合并两个具有O(1)额外空间的排序数组中的实现
方法2(O(n1 + n2)时间和O(n1 + n2)额外空间)
这个想法是使用合并排序的合并函数。
- 创建大小为n1 + n2的数组arr3 []。
- 同时遍历arr1 []和arr2 []。
- 在arr1 []和arr2 []中拾取较小的当前元素,将此较小的元素复制到arr3 []中的下一个位置,并在arr3 []中向前移动,并拾取其元素的数组。
- 如果arr1 []或arr2 []中还有剩余元素,请将它们也复制到arr3 []中。
下图是上述方法的模拟:
下面是上述方法的实现:
C++
// C++ program to merge two sorted arrays/
#include
using namespace std;
// Merge arr1[0..n1-1] and arr2[0..n2-1] into
// arr3[0..n1+n2-1]
void mergeArrays(int arr1[], int arr2[], int n1,
int n2, int arr3[])
{
int i = 0, j = 0, k = 0;
// Traverse both array
while (i
Java
// Java program to merge two sorted arrays
import java.util.*;
import java.lang.*;
import java.io.*;
class MergeTwoSorted
{
// Merge arr1[0..n1-1] and arr2[0..n2-1]
// into arr3[0..n1+n2-1]
public static void mergeArrays(int[] arr1, int[] arr2, int n1,
int n2, int[] arr3)
{
int i = 0, j = 0, k = 0;
// Traverse both array
while (i
Python 3
# Python program to merge
# two sorted arrays
# Merge arr1[0..n1-1] and
# arr2[0..n2-1] into
# arr3[0..n1+n2-1]
def mergeArrays(arr1, arr2, n1, n2):
arr3 = [None] * (n1 + n2)
i = 0
j = 0
k = 0
# Traverse both array
while i < n1 and j < n2:
# Check if current element
# of first array is smaller
# than current element of
# second array. If yes,
# store first array element
# and increment first array
# index. Otherwise do same
# with second array
if arr1[i] < arr2[j]:
arr3[k] = arr1[i]
k = k + 1
i = i + 1
else:
arr3[k] = arr2[j]
k = k + 1
j = j + 1
# Store remaining elements
# of first array
while i < n1:
arr3[k] = arr1[i];
k = k + 1
i = i + 1
# Store remaining elements
# of second array
while j < n2:
arr3[k] = arr2[j];
k = k + 1
j = j + 1
print("Array after merging")
for i in range(n1 + n2):
print(str(arr3[i]), end = " ")
# Driver code
arr1 = [1, 3, 5, 7]
n1 = len(arr1)
arr2 = [2, 4, 6, 8]
n2 = len(arr2)
mergeArrays(arr1, arr2, n1, n2);
# This code is contributed
# by ChitraNayal
C#
// C# program to merge
// two sorted arrays
using System;
class GFG
{
// Merge arr1[0..n1-1] and
// arr2[0..n2-1] into
// arr3[0..n1+n2-1]
public static void mergeArrays(int[] arr1, int[] arr2,
int n1, int n2, int[] arr3)
{
int i = 0, j = 0, k = 0;
// Traverse both array
while (i < n1 && j < n2)
{
// Check if current element
// of first array is smaller
// than current element
// of second array. If yes,
// store first array element
// and increment first array
// index. Otherwise do same
// with second array
if (arr1[i] < arr2[j])
arr3[k++] = arr1[i++];
else
arr3[k++] = arr2[j++];
}
// Store remaining
// elements of first array
while (i < n1)
arr3[k++] = arr1[i++];
// Store remaining elements
// of second array
while (j < n2)
arr3[k++] = arr2[j++];
}
// Driver code
public static void Main()
{
int[] arr1 = {1, 3, 5, 7};
int n1 = arr1.Length;
int[] arr2 = {2, 4, 6, 8};
int n2 = arr2.Length;
int[] arr3 = new int[n1+n2];
mergeArrays(arr1, arr2, n1, n2, arr3);
Console.Write("Array after merging\n");
for (int i = 0; i < n1 + n2; i++)
Console.Write(arr3[i] + " ");
}
}
// This code is contributed
// by ChitraNayal
PHP
CPP
// C++ program to merge two sorted arrays
//using maps
#include
using namespace std;
// Function to merge arrays
void mergeArrays(int a[], int b[], int n, int m)
{
// Declaring a map.
// using map as a inbuilt tool
// to store elements in sorted order.
map mp;
// Inserting values to a map.
for(int i = 0; i < n; i++)
mp[a[i]] = true;
for(int i = 0;i < m;i++)
mp[b[i]] = true;
// Printing keys of the map.
for(auto i: mp)
cout<< i.first <<" ";
}
// Driver Code
int main()
{
int a[] = {1, 3, 5, 7}, b[] = {2, 4, 6, 8};
int size = sizeof(a)/sizeof(int);
int size1 = sizeof(b)/sizeof(int);
// Function call
mergeArrays(a, b, size, size1);
return 0;
}
//This code is contributed by yashbeersingh42
Java
// Java program to merge two sorted arrays
//using maps
import java.io.*;
import java.util.*;
class GFG {
// Function to merge arrays
static void mergeArrays(int a[], int b[], int n, int m)
{
// Declaring a map.
// using map as a inbuilt tool
// to store elements in sorted order.
Map mp = new HashMap();
// Inserting values to a map.
for(int i = 0; i < n; i++)
{
mp.put(a[i], true);
}
for(int i = 0;i < m;i++)
{
mp.put(b[i], true);
}
// Printing keys of the map.
for (Map.Entry me : mp.entrySet())
{
System.out.print(me.getKey() + " ");
}
}
// Driver Code
public static void main (String[] args)
{
int a[] = {1, 3, 5, 7}, b[] = {2, 4, 6, 8};
int size = a.length;
int size1 = b.length;
// Function call
mergeArrays(a, b, size, size1);
}
}
// This code is contributed by rag2127
输出:
Array after merging
1 2 3 4 5 6 7 8
时间复杂度: O(n1 + n2)
辅助空间: O(n1 + n2)
方法3:使用地图(O(nlog(n)+ mlog(m))时间和O(N)额外空间)
- 将两个数组的元素插入映射中作为键。
- 打印地图键。
下面是上述方法的实现。
CPP
// C++ program to merge two sorted arrays
//using maps
#include
using namespace std;
// Function to merge arrays
void mergeArrays(int a[], int b[], int n, int m)
{
// Declaring a map.
// using map as a inbuilt tool
// to store elements in sorted order.
map mp;
// Inserting values to a map.
for(int i = 0; i < n; i++)
mp[a[i]] = true;
for(int i = 0;i < m;i++)
mp[b[i]] = true;
// Printing keys of the map.
for(auto i: mp)
cout<< i.first <<" ";
}
// Driver Code
int main()
{
int a[] = {1, 3, 5, 7}, b[] = {2, 4, 6, 8};
int size = sizeof(a)/sizeof(int);
int size1 = sizeof(b)/sizeof(int);
// Function call
mergeArrays(a, b, size, size1);
return 0;
}
//This code is contributed by yashbeersingh42
Java
// Java program to merge two sorted arrays
//using maps
import java.io.*;
import java.util.*;
class GFG {
// Function to merge arrays
static void mergeArrays(int a[], int b[], int n, int m)
{
// Declaring a map.
// using map as a inbuilt tool
// to store elements in sorted order.
Map mp = new HashMap();
// Inserting values to a map.
for(int i = 0; i < n; i++)
{
mp.put(a[i], true);
}
for(int i = 0;i < m;i++)
{
mp.put(b[i], true);
}
// Printing keys of the map.
for (Map.Entry me : mp.entrySet())
{
System.out.print(me.getKey() + " ");
}
}
// Driver Code
public static void main (String[] args)
{
int a[] = {1, 3, 5, 7}, b[] = {2, 4, 6, 8};
int size = a.length;
int size1 = b.length;
// Function call
mergeArrays(a, b, size, size1);
}
}
// This code is contributed by rag2127
输出:
1 2 3 4 5 6 7 8