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))
Recommended Articles