Merge two sorted arrays - GeeksforGeeks

11 Jan, 2022
Given two sorted arrays, the task is to merge them in a sorted manner.Examples: 
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} 
Method 1 (O(n1 * n2) Time and O(n1+n2) Extra Space) 
Create an array arr3[] of size n1 + n2.Copy all n1 elements of arr1[] to arr3[]Traverse arr2[] and one by one insert elements (like insertion sort) of arr3[] to arr1[]. This step take O(n1 * n2) time.
Create an array arr3[] of size n1 + n2.
Copy all n1 elements of arr1[] to arr3[]
Traverse arr2[] and one by one insert elements (like insertion sort) of arr3[] to arr1[]. This step take O(n1 * n2) time.
We have discussed implementation of above method in Merge two sorted arrays with O(1) extra spaceMethod 2 (O(n1 + n2) Time and O(n1 + n2) Extra Space) The idea is to use Merge function of Merge sort. 
Create an array arr3[] of size n1 + n2.Simultaneously traverse arr1[] and arr2[]. Pick smaller of current elements in arr1[] and arr2[], copy this smaller element to next position in arr3[] and move ahead in arr3[] and the array whose element is picked.If there are remaining elements in arr1[] or arr2[], copy them also in arr3[].
Create an array arr3[] of size n1 + n2.
Simultaneously traverse arr1[] and arr2[]. Pick smaller of current elements in arr1[] and arr2[], copy this smaller element to next position in arr3[] and move ahead in arr3[] and the array whose element is picked.
Pick smaller of current elements in arr1[] and arr2[], copy this smaller element to next position in arr3[] and move ahead in arr3[] and the array whose element is picked.
If there are remaining elements in arr1[] or arr2[], copy them also in arr3[].
Below image is a dry run of the above approach: 
Below is the implementation of the above approach: 
C++
Java
Python 3
C#
PHP
Javascript
// C++ program to merge two sorted arrays/#include<iostream>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<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 codeint main(){    int arr1[] = {1, 3, 5, 7};    int n1 = sizeof(arr1) / sizeof(arr1[0]);     int arr2[] = {2, 4, 6, 8};    int n2 = sizeof(arr2) / sizeof(arr2[0]);     int arr3[n1+n2];    mergeArrays(arr1, arr2, n1, n2, arr3);     cout << "Array after merging" <<endl;    for (int i=0; i < n1+n2; i++)        cout << arr3[i] << " ";     return 0;}
// Java program to merge two sorted arraysimport 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<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++];    }         public static void main (String[] args)    {        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);             System.out.println("Array after merging");        for (int i=0; i < n1+n2; i++)            System.out.print(arr3[i] + " ");    }} /* This code is contributed by Mr. Somesh Awasthi */
# 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 codearr1 = [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# program to merge// two sorted arraysusing 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// PHP program to merge// two sorted arrays // Merge $arr1[0..$n1-1] and//       $arr2[0..$n2-1] into//       $arr3[0..$n1+$n2-1]function mergeArrays(&$arr1, &$arr2,                      $n1, $n2, &$arr3){    $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$arr1 = array(1, 3, 5, 7);$n1 = sizeof($arr1); $arr2 = array(2, 4, 6, 8);$n2 = sizeof($arr2); $arr3[$n1 + $n2] = array();mergeArrays($arr1, $arr2, $n1,                   $n2, $arr3); echo "Array after merging \n" ;for ($i = 0; $i < $n1 + $n2; $i++)    echo $arr3[$i] . " "; // This code is contributed// by ChitraNayal?>
<script>// javascript program to merge two sorted arrays     // Merge arr1[0..n1-1] and arr2[0..n2-1]    // into arr3[0..n1+n2-1]    function mergeArrays(arr1,  arr2 , n1 , n2,  arr3) {        var 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++];    }              var arr1 = [ 1, 3, 5, 7 ];        var n1 = arr1.length;         var arr2 = [ 2, 4, 6, 8 ];        var n2 = arr2.length;         var arr3 = Array(n1 + n2).fill(0);         mergeArrays(arr1, arr2, n1, n2, arr3);         document.write("Array after merging<br/>");        for (i = 0; i < n1 + n2; i++)            document.write(arr3[i] + " "); // This code contributed by Rajput-Ji</script>
Output: 
Array after merging
1 2 3 4 5 6 7 8
Time Complexity : O(n1 + n2) Auxiliary Space : O(n1 + n2)Method 3: Using Maps (O(nlog(n) + mlog(m)) Time and O(N) Extra Space) 
Insert elements of both arrays in a map as keys.Print the keys of the map.
Insert elements of both arrays in a map as keys.
Print the keys of the map.
Below is the implementation of above approach. 
CPP
Java
C#
Javascript
// C++ program to merge two sorted arrays//using maps#include<bits/stdc++.h>using namespace std; // Function to merge arraysvoid 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<int, bool> 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 Codeint 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 program to merge two sorted arrays//using mapsimport 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<Integer,Boolean> mp = new TreeMap<Integer,Boolean>();               // 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<Integer,Boolean> 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
// C# program to merge two sorted arrays//using mapsusing System;using System.Collections.Generic; public 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.    SortedDictionary<int, Boolean> mp = new SortedDictionary<int, Boolean>();     // Inserting values to a map.    for (int i = 0; i < n; i++) {      mp.Add(a[i], true);    }    for (int i = 0; i < m; i++) {      mp.Add(b[i], true);    }     // Printing keys of the map.    foreach (KeyValuePair<int, Boolean> me in mp) {      Console.Write(me.Key + " ");    }  }   // Driver Code  public static void Main(String[] args) {    int []a = { 1, 3, 5, 7 };    int []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 gauravrajput1
<script>// javascript program to merge two sorted arrays//using maps         // Function to merge arrays    function mergeArrays(a , b , n , m)    {         // Declaring a map.        // using map as a inbuilt tool        // to store elements in sorted order.        var mp = new Map();         // Inserting values to a map.        for (i = 0; i < n; i++) {            mp.set(a[i], true);        }        for (i = 0; i < m; i++) {            mp.set(b[i], true);        }        var a = [];                 // Printing keys of the map.        for ( me of mp.keys()) {            a.push(me);        }        a.sort();        for ( me of a) {            document.write(me + " ");        }    }     // Driver Code        var a = [ 1, 3, 5, 7 ], b = [ 2, 4, 6, 8 ];        var size = a.length;        var size1 = b.length;         // Function call        mergeArrays(a, b, size, size1); // This code is contributed by gauravrajput1</script>
Output:
1 2 3 4 5 6 7 8
Time Complexity: O( nlog(n) + mlog(m) ) Auxiliary Space: O(N)Brocade,Goldman-Sachs,Juniper,Linkedin,Microsoft,Quikr,Snapdeal,Synopsys,ZohoRelated Articles : Merge two sorted arrays with O(1) extra space Merge k sorted arrays | Set 1This article is contributed by Sahil Chhabra. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
ukasp
nkkanasagara
Patabhu
nidhi_biet
yashbeersingh42
parth_gpta
rag2127
local-dante
drig
rohitharjani0107
Rajput-Ji
GauravRajput1
Amazon
Amdocs
Brocade
Goldman Sachs
Insertion Sort
Juniper Networks
Linkedin
Merge Sort
Microsoft
Quikr
Snapdeal
Synopsys
Visa
Zoho
Arrays
Mathematical
Sorting
Zoho
Amazon
Microsoft
Snapdeal
Visa
Goldman Sachs
Linkedin
Amdocs
Brocade
Juniper Networks
Quikr
Synopsys
Arrays
Mathematical
Sorting
Merge Sort
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Arrays
Multidimensional Arrays in Java
Linked List vs Array
Python | Using 2D arrays/lists the right way
Search an element in a sorted and rotated array
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7