class GFG
{
static a = 0;
static b = 0;
static swap(arr, i, j)
{
var
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return
arr;
}
static Partition(arr, l, r)
{
var
lst = arr[r];
var
i = l;
var
j = l;
while
(j < r)
{
if
(arr[j] < lst)
{
arr = GFG.swap(arr, i, j);
i++;
}
j++;
}
arr = GFG.swap(arr, i, r);
return
i;
}
static randomPartition(arr, l, r)
{
var
n = r - l + 1;
var
pivot = parseInt((Math.random() % n));
arr = GFG.swap(arr, l + pivot, r);
return
GFG.Partition(arr, l, r);
}
static MedianUtil(arr, l, r, k)
{
if
(l <= r)
{
var
partitionIndex = GFG.randomPartition(arr, l, r);
if
(partitionIndex == k)
{
GFG.b = arr[partitionIndex];
if
(GFG.a != -1)
{
return
-Number.MAX_VALUE;
}
}
else
if
(partitionIndex == k - 1)
{
GFG.a = arr[partitionIndex];
if
(GFG.b != -1)
{
return
-Number.MAX_VALUE;
}
}
if
(partitionIndex >= k)
{
return
GFG.MedianUtil(arr, l, partitionIndex - 1, k);
}
else
{
return
GFG.MedianUtil(arr, partitionIndex + 1, r, k);
}
}
return
-Number.MAX_VALUE;
}
static findMedian(arr, n)
{
var
ans = 0;
GFG.a = -1;
GFG.b = -1;
if
(n % 2 == 1)
{
GFG.MedianUtil(arr, 0, n - 1, parseInt(n / 2));
ans = GFG.b;
}
else
{
GFG.MedianUtil(arr, 0, n - 1, parseInt(n / 2));
ans = parseInt((GFG.a + GFG.b) / 2);
}
console.log(
"Median = "
+ ans);
}
static main(args)
{
var
arr = [12, 3, 5, 7, 4, 19, 26];
var
n = arr.length;
GFG.findMedian(arr, n);
}
}
GFG.main([]);