Проблема с вашим кодом (за исключением ошибки, упомянутой Майком Коуэном) заключается в том, что вы не выполняете никакой реальной сортировки. Сначала вы рекурсивно разбиваете свои списки пополам (что правильно), но затем вы просто объединяете их вместе в их первоначальном порядке, что не дает результата:
merge.AddRange(left);
merge.AddRange(right);
Вместо этого вам нужно перебрать два ваших подсписка (которые по индукции должны были быть соответственно отсортированы в рекурсивных вызовах) и добавить элементы в объединенный список в порядке .
Мы начнем со сравнения элементов 0 th : left[0]
с right[0]
. В зависимости от того, какое из двух значений меньше, оно добавляется в список merge
, а счетчик его подсписка увеличивается. Предположим, что left[0] < right[0]
: мы добавляем left[0]
к merge
, и на следующей итерации нам потребуется рассмотреть left[1]
против right[0]
. Если left[1]
снова меньше, мы добавляем его к merge
и на следующей итерации рассмотрим left[2]
против right[0]
. Если right[0]
теперь меньше из двух, мы добавляем it к merge
и на следующей итерации сравниваем left[2]
с right[1]
. И так далее.
Это продолжается до тех пор, пока один из подсписков не будет исчерпан. Когда это происходит, мы просто добавляем все элементы из оставшегося подсписка в merge
.
int leftIndex = 0;
int rightIndex = 0;
while (leftIndex < left.Count && rightIndex < right.Count)
if (left[leftIndex] < right[rightIndex])
merge.Add(left[leftIndex++]);
else
merge.Add(right[rightIndex++]);
while (leftIndex < left.Count)
merge.Add(left[leftIndex++]);
while (rightIndex < right.Count)
merge.Add(right[rightIndex++]);
Кроме того, вы не должны писать в консоль в пределах вашего рекурсивного метода. Переместите Console.Write
звонки на ваш Main
метод:
static void Main(string[] args)
{
List<int> original = new List<int>(new int[] { 4, 75, 12, 65, 2, 71, 56, 33, 78,1, 4, 56, 85, 12, 5,77, 32, 5 });
List<int> sorted = mergeSort(original);
for (int k = 0; k < sorted.Count; k++)
Console.Write(sorted[k] + ",");
}