using System.Collections;
using System.Collections.Generic;
public static void Main()
int[] a = { 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95};
int[] b = {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58 };
List<int> abList = new List<int>();
foreach (int element in a) {abList.Add(element);}
foreach (int element in b) {abList.Add(element);}
int[] ab = abList.ToArray();
double abSolved = MedianOfArray(ab);
Console.WriteLine("Median:\t" + FindMedianSortedArrays(a, b));
Console.WriteLine("Should be:\t" + abSolved);
public static double FindMedianSortedArrays(int[] nums1, int[] nums2)
int totalElements = nums1.Length + nums2.Length;
if (nums1[nums1.Length / 2] <= nums2[nums2.Length / 2])
lowerMed = lower.Length / 2;
greaterMed = greater.Length / 2;
lowerMed = lower.Length / 2;
greaterMed = greater.Length / 2;
if (lower.Length == greater.Length)
else if (lower.Length % 2 == 0)
else if (greater.Length % 2 == 0 && greater.Length > lower.Length)
Console.Write("Initial lower: { ");
foreach (int element in lower) { Console.Write($"{element} ");}
Console.Write($"}} n = {lower.Length}\n");
Console.WriteLine($"lower median is lower[{lowerMed}] = {lower[lowerMed]}");
Console.Write("Initial greater: { ");
foreach (int element in greater) { Console.Write($"{element} ");}
Console.Write($"}} n = {greater.Length}\n");
Console.WriteLine($"greater median is greater[{greaterMed}] = {greater[greaterMed]}");
if (lower[lowerMed] == greater[greaterMed])
if (lower.Length % 2 == 0 && greater.Length % 2 == 0 )
return MedianOfInts(lower[lowerMed],Math.Max(lower[lowerMed - 1],greater[greaterMed - 1]));
while (lower.Length > 1 && greater.Length > 1)
lower = lower[(lowerMed + 1)..];
greater = greater[..(greaterMed)];
Console.Write("new lower: { ");
foreach (int element in lower) { Console.Write($"{element} ");}
Console.Write($"}} n = {lower.Length}\n");
Console.Write("new greater: { ");
foreach (int element in greater) { Console.Write($"{element} ");}
Console.Write($"}} n = {greater.Length}\n");
var shift = calculateShift(lower, greater);
greaterMed = greater.Length - shift;
Console.WriteLine($"\nlower median is lower[{lowerMed}] = {lower[lowerMed]}");
Console.WriteLine($"\ngreater median is greater[{greaterMed}] = {greater[greaterMed]}");
totalEliminated += shift * 2;
Console.WriteLine($"{BelowMedian} bottom values have been eliminated from lower[]");
Console.WriteLine($"{AboveMedian} upper values have been eliminated from greater[]");
Console.WriteLine($"{totalEliminated} / {totalElements}");
if (lower[lowerMed] > greater[greaterMed])
Console.WriteLine("\nThe arrays swapped places\n");
lowerMed = lower.Length / 2;
greaterMed = greater.Length / 2;
if ((nums1.Length + nums2.Length) % 2 == 0)
if (lower[lowerMed] < greater[greaterMed - 1])
return MedianOfInts(greater[greaterMed], greater[greaterMed - 1]);
return MedianOfInts(greater[greaterMed], lower[0]);
return greater[greaterMed];
if ((nums1.Length + nums2.Length) % 2 == 0)
if (lower[lowerMed + 1] < greater[greaterMed])
return MedianOfInts(lower[lowerMed], lower[lowerMed + 1]);
return MedianOfInts(lower[lowerMed], greater[0]);
public static double MedianOfArray(int[] a)
return (a[(a.Length - 1) / 2] + a[a.Length / 2]) / 2.0;
return (a[a.Length / 2]);
public static double MedianOfInts(int a, int b)
public static int calculateShift(int[] low, int[] high)
int lowerShift = (low.Length / 2) + 1;
int greaterShift = high.Length - (high.Length / 2);
if (lowerShift > greaterShift)
Console.WriteLine($"greaterShift is a smaller jump, shift = {greaterShift}");
else if (lowerShift < greaterShift)
Console.WriteLine($"lowerShift is a smaller jump, shift = {lowerShift}");
Console.WriteLine($"shifts are equal, shift = {lowerShift}");
return Math.Min(lowerShift, greaterShift);