Разделяй и властвуй: подсчет количества инверсий в массиве
Есть функция для подсчета инверсий в массиве, требующая О(n2) времени:
static void Inverses(int[] A, ref int count)
{
count = 0;
for(int i = 0; i < A.Length - 1; i++)
{
for (int j = i + 1; j < A.Length; j++)
{
if( A[i] > A[j] )
count++;
}
}
}
Также есть функция сортировки массива подходом разделяй и властвуй, требующая O(n*log(n)) времени:
static Int32[] Merge_Sort(Int32[] massive)
{
if (massive.Length == 1)
return massive;
Int32 mid_point = massive.Length / 2;
return Merge(Merge_Sort(massive.Take(mid_point).ToArray()), Merge_Sort(massive.Skip(mid_point).ToArray()));
}
static Int32[] Merge(Int32[] mass1, Int32[] mass2)
{
Int32 a = 0, b = 0;
Int32[] merged = new int[mass1.Length + mass2.Length];
for (Int32 i = 0; i < mass1.Length + mass2.Length; i++)
{
if (b < mass2.Length && a < mass1.Length)
if (mass1[a] > mass2[b])
merged[i] = mass2[b++];
else //if int go for
merged[i] = mass1[a++];
else
if (b < mass2.Length)
merged[i] = mass2[b++];
else
merged[i] = mass1[a++];
}
return merged;
}
Нужно реализовать алгоритм подсчета инверсий в массиве с подходом разделяй и властвуй, которому требовалось бы O(n*log(n)) времени.
К сожалению, мне достаточно тяжело дается понимание рекурсии, когда первый метод вызывает другой метод, а другой вызывает первый при условии.