📜  合并两个排序的数组

📅  最后修改于: 2021-05-04 21:10:53             🧑  作者: Mango

给定两个排序数组,任务是以排序方式合并它们。
例子:

方法1(O(n1 * n2)时间和O(1)额外空间)

  1. 创建大小为n1 + n2的数组arr3 []。
  2. 将arr1 []的所有n1个元素复制到arr3 []
  3. 遍历arr2 []和arr3 []到arr1 []的一对一插入元素(如插入排序)。此步骤需要O(n1 * n2)时间。

我们已经讨论了以上方法的实现在合并两个具有O(1)额外空间的排序数组中的实现
方法2(O(n1 + n2)时间和O(n1 + n2)额外空间)
这个想法是使用合并排序的合并函数。

  1. 创建大小为n1 + n2的数组arr3 []。
  2. 同时遍历arr1 []和arr2 []。
    • 在arr1 []和arr2 []中拾取较小的当前元素,将此较小的元素复制到arr3 []中的下一个位置,并在arr3 []中向前移动,并拾取其元素的数组。
  3. 如果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)额外空间)

  1. 将两个数组的元素插入映射中作为键。
  2. 打印地图键。

下面是上述方法的实现。

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