Median of two sorted arrays of different sizes | Set 1 (Linear)
This is an extension of the median of two sorted arrays of equal size problem. Here we handle arrays of unequal size also.
Examples:
Input: a[] = {1, 12, 15, 26, 38} b[] = {2, 13, 24} Output: 14 Explanation: After merging arrays the result is 1, 2, 12, 13, 15, 24, 26, 38 median = (13 + 15)/2 = 14. Input: a[] = {1, 3, 5, 7} b[] = {2, 4, 6, 8} Output: 5 Explanation : After merging arrays the result is 1, 2, 3, 4, 5, 6, 7, 8, 9 median = 5
Approach:
- The approach discussed in this post is similar to method 1 of equal size median. Use merge procedure of merge sort.
- Keep a variable to track of count while comparing elements of two arrays.
- Perform merge of two sorted arrays. Increase the value of count as a new element is inserted.
- The most efficient way of merging two arrays is to compare the top of both arrays and pop the smaller value and increase the count.
- Continue comparing the top/first elements of both arrays until there are no elements left in any arrays
- Now to find the median there are two cases to be handled.
- If the sum of length of array sizes is even then store the elements when the count is of value ((n1 + n2)/2)-1 and (n1 + n2)/2 in the merged array add the elements and divide by 2 return the value as median.
- If the value(sum of sizes) is odd then return the (n1 + n2)/2 th element(when value of count is (n1 + n2)/2) as median.
C++
// A C++ program to find median of two sorted arrays of // unequal sizes #include <bits/stdc++.h> using namespace std; // A utility function to find median of two integers /* This function returns median of a[] and b[]. Assumptions in this function: Both a[] and b[] are sorted arrays */ float findmedian( int a[], int n1, int b[], int n2) { int i = 0; /* Current index of i/p array a[] */ int j = 0; /* Current index of i/p array b[] */ int k; int m1 = -1, m2 = -1; for (k = 0; k <= (n1 + n2) / 2; k++) { if (i < n1 && j < n2) { if (a[i] < b[j]) { m2 = m1; m1 = a[i]; i++; } else { m2 = m1; m1 = b[j]; j++; } } /* Below is to handle the case where all elements of a[] are smaller than smallest(or first) element of b[] or a[] is empty*/ else if (i == n1) { m2 = m1; m1 = b[j]; j++; } /* Below is to handle case where all elements of b[] are smaller than smallest(or first) element of a[] or b[] is empty*/ else if (j == n2) { m2 = m1; m1 = a[i]; i++; } } /*Below is to handle the case where sum of number of elements of the arrays is even */ if ((n1 + n2) % 2 == 0) return (m1 + m2) * 1.0 / 2; /* Below is to handle the case where sum of number of elements of the arrays is odd */ return m1; } // Driver program to test above functions int main() { int a[] = { 1, 12, 15, 26, 38 }; int b[] = { 2, 13, 24 }; int n1 = sizeof (a) / sizeof (a[0]); int n2 = sizeof (b) / sizeof (b[0]); printf ( "%f" , findmedian(a, n1, b, n2)); return 0; } |
Java
// A Java program to find median of two sorted arrays of // unequal sizes import java.io.*; class GFG { // A utility function to find median of two integers /* This function returns median of a[] and b[]. Assumptions in this function: Both a[] and b[] are sorted arrays */ static float findmedian( int a[], int n1, int b[], int n2) { int i = 0 ; /* Current index of i/p array a[] */ int j = 0 ; /* Current index of i/p array b[] */ int k; int m1 = - 1 , m2 = - 1 ; for (k = 0 ; k <= (n1 + n2) / 2 ; k++) { if (i < n1 && j < n2) { if (a[i] < b[j]) { m2 = m1; m1 = a[i]; i++; } else { m2 = m1; m1 = b[j]; j++; } } /* Below is to handle the case where all elements of a[] are smaller than smallest(or first) element of b[] or a[] is empty*/ else if (i == n1) { m2 = m1; m1 = b[j]; j++; } /* Below is to handle case where all elements of b[] are smaller than smallest(or first) element of a[] or b[] is empty*/ else if (j == n2) { m2 = m1; m1 = a[i]; i++; } } /*Below is to handle the case where sum of number of elements of the arrays is even */ if ((n1 + n2) % 2 == 0 ) { return (m1 + m2) * ( float ) 1.0 / 2 ; } /* Below is to handle the case where sum of number of elements of the arrays is odd */ return m1; } // Driver program to test above functions public static void main(String[] args) { int a[] = { 1 , 12 , 15 , 26 , 38 }; int b[] = { 2 , 13 , 24 }; int n1 = a.length; int n2 = b.length; System.out.println(findmedian(a, n1, b, n2)); } } // This code has been contributed by inder_verma. |
Python3
# Python3 program to find median of # two sorted arrays of unequal sizes # A utility function to find median # of two integers ''' This function returns median of a[] and b[]. Assumptions in this function: Both a[] and b[] are sorted arrays ''' def findmedian(a, n1, b, n2): i = 0 # Current index of i / p array a[] j = 0 # Current index of i / p array b[] m1 = - 1 m2 = - 1 for k in range (((n1 + n2) / / 2 ) + 1 ) : if (i < n1 and j < n2) : if (a[i] < b[j]) : m2 = m1 m1 = a[i] i + = 1 else : m2 = m1 m1 = b[j] j + = 1 # Below is to handle the case where # all elements of a[] are # smaller than smallest(or first) # element of b[] or a[] is empty elif (i = = n1) : m2 = m1 m1 = b[j] j + = 1 # Below is to handle case where # all elements of b[] are # smaller than smallest(or first) # element of a[] or b[] is empty elif (j = = n2) : m2 = m1 m1 = a[i] i + = 1 '''Below is to handle the case where sum of number of elements of the arrays is even ''' if ((n1 + n2) % 2 = = 0 ): return (m1 + m2) * 1.0 / 2 ''' Below is to handle the case where sum of number of elements of the arrays is odd ''' return m1 # Driver Code if __name__ = = "__main__" : a = [ 1 , 12 , 15 , 26 , 38 ] b = [ 2 , 13 , 24 ] n1 = len (a) n2 = len (b) print (findmedian(a, n1, b, n2)) # This code is contributed # by ChitraNayal |
C#
// A C# program to find median // of two sorted arrays of // unequal sizes using System; class GFG { // A utility function to find // median of two integers /* This function returns median of a[] and b[]. Assumptions in this function: Both a[] and b[] are sorted arrays */ static float findmedian( int [] a, int n1, int [] b, int n2) { int i = 0; /* Current index of i/p array a[] */ int j = 0; /* Current index of i/p array b[] */ int k; int m1 = -1, m2 = -1; for (k = 0; k <= (n1 + n2) / 2; k++) { if (i < n1 && j < n2) { if (a[i] < b[j]) { m2 = m1; m1 = a[i]; i++; } else { m2 = m1; m1 = b[j]; j++; } } /* Below is to handle the case where all elements of a[] are smaller than smallest(or first) element of b[] or a[] is empty*/ else if (i == n1) { m2 = m1; m1 = b[j]; j++; } /* Below is to handle case where all elements of b[] are smaller than smallest(or first) element of a[] or b[] is empty*/ else if (j == n2) { m2 = m1; m1 = a[i]; i++; } } /*Below is to handle the case where sum of number of elements of the arrays is even */ if ((n1 + n2) % 2 == 0) { return (m1 + m2) * ( float )1.0 / 2; } /* Below is to handle the case where sum of number of elements of the arrays is odd */ return m1; } // Driver Code public static void Main() { int [] a = { 1, 12, 15, 26, 38 }; int [] b = { 2, 13, 24 }; int n1 = a.Length; int n2 = b.Length; Console.WriteLine(findmedian(a, n1, b, n2)); } } // This code is contributed // by Subhadeep Gupta |
PHP
<?php // A PHP program to find median of // two sorted arrays of unequal sizes // A utility function to find // median of two integers /* This function returns median of a[] and b[]. Assumptions in this function: Both a[] and b[] are sorted arrays */ function findmedian( $a , $n1 , $b , $n2 ) { $i = 0; /* Current index of i/p array a[] */ $j = 0; /* Current index of i/p array b[] */ $k ; $m1 = -1; $m2 = -1; for ( $k = 0; $k <= ( $n1 + $n2 ) / 2; $k ++) { if ( $i < $n1 and $j < $n2 ) { if ( $a [ $i ] < $b [ $j ]) { $m2 = $m1 ; $m1 = $a [ $i ]; $i ++; } else { $m2 = $m1 ; $m1 = $b [ $j ]; $j ++; } } /* Below is to handle the case where all elements of a[] are smaller than smallest(or first) element of b[] or a[] is empty*/ else if (i == n1) { $m2 = $m1 ; $m1 = $b [j]; $j ++; } /* Below is to handle case where all elements of b[] are smaller than smallest(or first) element of a[] or b[] is empty*/ else if ( $j == $n2 ) { $m2 = $m1 ; $m1 = $a [ $i ]; $i ++; } } /*Below is to handle the case where sum of number of elements of the arrays is even */ if (( $n1 + $n2 ) % 2 == 0) return ( $m1 + $m2 ) * 1.0 / 2; /* Below is to handle the case where sum of number of elements of the arrays is odd */ return m1; } // Driver Code $a = array ( 1, 12, 15, 26, 38 ); $b = array ( 2, 13, 24 ); $n1 = count ( $a ); $n2 = count ( $b ); echo (findmedian( $a , $n1 , $b , $n2 )); // This code is contributed // by inder_verma. ?> |
Javascript
<script> // A Javascript program to find median // of two sorted arrays of unequal sizes // A utility function to find median of two integers // This function returns median of a[] and b[]. // Assumptions in this function: Both a[] and b[] // are sorted arrays function findmedian(a, n1, b, n2) { let i = 0; /* Current index of i/p array a[] */ let j = 0; /* Current index of i/p array b[] */ let k; let m1 = -1, m2 = -1; for (k = 0; k <= (n1 + n2) / 2; k++) { if (i < n1 && j < n2) { if (a[i] < b[j]) { m2 = m1; m1 = a[i]; i++; } else { m2 = m1; m1 = b[j]; j++; } } /* Below is to handle the case where all elements of a[] are smaller than smallest(or first) element of b[] or a[] is empty*/ else if (i == n1) { m2 = m1; m1 = b[j]; j++; } /* Below is to handle case where all elements of b[] are smaller than smallest(or first) element of a[] or b[] is empty*/ else if (j == n2) { m2 = m1; m1 = a[i]; i++; } } /*Below is to handle the case where sum of number of elements of the arrays is even */ if ((n1 + n2) % 2 == 0) { return (m1 + m2) * 1.0 / 2; } /* Below is to handle the case where sum of number of elements of the arrays is odd */ return m1; } // Driver code let a = [ 1, 12, 15, 26, 38 ]; let b = [ 2, 13, 24 ]; let n1 = a.length; let n2 = b.length; document.write(findmedian(a, n1, b, n2)); // This code is contributed by rag2127 </script> |
Output:
14.000000
Complexity Analysis:
- Time Complexity: O(n), Both the lists need to be traversed so the time complexity is O(n).
- Auxiliary Space: O(1), no extra space is required.
More Efficient (Log time complexity methods)
- Median of two sorted arrays of different sizes.
- Median of two sorted arrays of different sizes in min(Log (n1, n2))
Please Login to comment...