Merge two sorted arrays

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, 5, 6, 7, 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(1) Extra Space)

  1. Create an array arr3[] of size n1 + n2.
  2. Copy all n1 elements of arr1[] to arr3[]
  3. 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 space

Method 2 (O(n1 + n2) Time and O(n1 + n2) Extra Space)
The idea is to use Merge function of Merge sort.

  1. Create an array arr3[] of size n1 + n2.
  2. 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.
  3. If there are are remaining elements in arr1[] or arr2[], copy them also in arr3[].

C++

// 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 code
int 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

// 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<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 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

<?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
?>


Output:

Array after merging
1 2 3 4 5 6 7 8

Time Complexity : O(n1 + n2)
Auxiliary Space : O(n1 + n2)


Brocade,Goldman-Sachs,Juniper,Linkedin,Microsoft,Quikr,Snapdeal,Synopsys,Zoho

Related Articles :
Merge two sorted arrays with O(1) extra space
Merge k sorted arrays | Set 1

This article is contributed by Sahil Chhabra. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@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.



My Personal Notes arrow_drop_up

Improved By : ChitraNayal