using
System;
class
Program {
static
int
CalculateSum(
int
[] arr,
int
n,
int
x)
{
int
sum = 0;
for
(
int
i = 0; i < n; i++) {
sum += Math.Abs(arr[i] - x);
}
return
sum;
}
static
void
QuickSort(
int
[] arr,
int
l,
int
h)
{
if
(l < h) {
int
n = h - l + 1;
int
med = KthSmallest(arr, l, h, n / 2);
int
p = Partition(arr, l, h, med);
QuickSort(arr, l, p - 1);
QuickSort(arr, p + 1, h);
}
}
static
int
FindMedian(
int
[] arr,
int
n)
{
Array.Sort(arr);
return
arr[n / 2];
}
static
int
KthSmallest(
int
[] arr,
int
l,
int
r,
int
k)
{
if
(k > 0 && k <= r - l + 1) {
int
n = r - l
+ 1;
int
i, count = 0;
int
[] median
=
new
int
[(n + 4)
/ 5];
for
(i = 0; i < n / 5; i++) {
median[i] = FindMedian(arr, 5);
count++;
}
if
(i * 5 < n)
{
median[i] = FindMedian(arr, n % 5);
count++;
i++;
}
int
medOfMed
= (count == 1)
? median[0]
: KthSmallest(median, 0, count - 1,
count / 2);
int
pos = Partition(arr, l, r, medOfMed);
if
(pos - l == k - 1)
return
arr[pos];
if
(pos - l
> k - 1)
return
KthSmallest(arr, l, pos - 1, k);
return
KthSmallest(arr, pos + 1, r,
k - pos + l - 1);
}
return
int
.MaxValue;
}
static
void
Swap(
ref
int
a,
ref
int
b)
{
int
temp = a;
a = b;
b = temp;
}
static
int
Partition(
int
[] arr,
int
l,
int
r,
int
x)
{
int
i;
for
(i = l; i < r; i++) {
if
(arr[i] == x)
break
;
}
Swap(
ref
arr[i],
ref
arr[r]);
i = l;
for
(
int
j = l; j <= r - 1; j++) {
if
(arr[j] <= x) {
Swap(
ref
arr[i],
ref
arr[j]);
i++;
}
}
Swap(
ref
arr[i],
ref
arr[r]);
return
i;
}
static
void
PrintArray(
int
[] arr,
int
size)
{
for
(
int
i = 0; i < size; i++)
Console.Write(arr[i] +
" "
);
Console.WriteLine();
}
static
void
Main()
{
int
[] arr
= { 1000, 10, 7, 8, 9, 30, 900, 1, 5, 6, 20 };
int
n = arr.Length;
QuickSort(arr, 0, n - 1);
Console.WriteLine(
"Sorted array is"
);
PrintArray(arr, n);
}
}