static void MergeSort<T>(T[] unsortedArray, int p, int r) where T:IComparable
{
if(p < r)
{
int q = (p + r)/2;
MergeSort(unsortedArray, p, q);
MergeSort(unsortedArray, q + 1, r);
Merge(unsortedArray, p, q, r);
}
}
static void Merge<T>(T[] unsortedArray, int p, int q, int r) where T: IComparable
{
var n1 = q - p + 1;
var n2 = r - q;
var subArray1 = new T[n1];
var subArray2 = new T[n2];
for (int i = 0; i < n1; i++)
{
subArray1[i] = unsortedArray[p + i];
}
for (int j = 0; j < n2; j++)
{
subArray2[j] = unsortedArray[q + j + 1];
}
int l = 0;
int m = 0;
for (int k = p; k <= r; k++)
{
if(m < subArray2.Length && l < subArray1.Length)
{
if(subArray1[l].CompareTo(subArray2[m]) <= 0 )
{
unsortedArray[k] = subArray1[l];
l = l + 1;
}
else
{
unsortedArray[k] = subArray2[m];
m = m + 1;
}
}
else if(l < subArray1.Length && !(m < subArray2.Length))
{
unsortedArray[k] = subArray1[l];
l = l + 1;
}
else if(m < subArray2.Length && !(l < subArray1.Length))
{
unsortedArray[k] = subArray2[m];
m = m + 1;
}
}
}