#include <stdio.h>
#include <stdlib.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// Function to partition array around pivot element
int partition(int arr[], int l, int r) {
int pivot = arr[r];
int i = l;
for (int j = l; j < r; j++) {
if (arr[j] < pivot) {
swap(&arr[i], &arr[j]);
i++;
}
}
swap(&arr[i], &arr[r]);
return i;
}
void medianHelper(int arr[], int l, int r, int k, int* a, int* b) {
if (l <= r) {
int pi = partition(arr, l, r);
// If partition index matches k, we found one of the medians
if (pi == k) {
*b = arr[pi];
if (*a != -1)
return;
}
// If partition index matches k - 1, we found the other median
else if (pi == k - 1) {
*a = arr[pi];
if (*b != -1)
return;
}
// If partition index is greater than or equal to k, recurse on the left
if (pi >= k)
medianHelper(arr, l, pi - 1, k, a, b);
else
// Recurse on the right
medianHelper(arr, pi + 1, r, k, a, b);
}
}
// Function to find the median of the array
int findMedian(int arr[], int n) {
int a = -1, b = -1, m;
// If n is odd
if (n % 2 == 1) {
medianHelper(arr, 0, n - 1, n / 2, &a, &b);
m = b;
} else {
// If n is even
medianHelper(arr, 0, n - 1, n / 2, &a, &b);
m = (a + b) / 2;
}
return m;
}
int main() {
int arr[] = {1, 3, 5, 2, 4};
int n = sizeof(arr) / sizeof(arr[0]);
printf("%d", findMedian(arr, n));
return 0;
}