Ваша проблема с кодом, который определяет, в какой список помещать каждый элемент в
if (list.IndexOf(item) <= (list.Count / 2))
Если в списке 2 элемента, то индексы равны 0 и 1, и это условие верно для обоих, поэтому они оба внесены в левый список и ничего в правый. Затем вы звоните
left = MergeSort(left);
, который берет список из 2-х элементов, и снова он собирается поместить оба слева и вызвать его снова и поместить их оба слева и .... навсегда.
Просто измените сравнение на
if (list.IndexOf(item) < (list.Count / 2))
Кроме того, вы не должны использовать IndexOf
, поскольку он вернет индекс первого элемента вместо текущего, если у вас есть дубликаты в списке. Таким образом, список с «ab c» в нем дважды будет возвращать 0 оба раза, и вы попадете в один и тот же бесконечный l oop. Вместо этого вы можете просто сделать for
l oop вот так
for (int i = 0; i < list.Count; i++)
{
if (i < (list.Count / 2))
{
left.Add(list[i]);
}
else
{
right.Add(list[i]);
}
}