У меня есть исходный код Mergesort для неупорядоченного связанного списка следующим образом. Предположим, что я уже выполнил функцию merge
, а z
- это сторожевой ключ.
node *mergesort(node *c)
{
node *a, *b;
if (c->next != z)
{
a = c;
b = c->next->next->next;
while (b != z)
{
c = c->next;
b = b->next->next;
}
b = c->next;
c->next = c;
return merge(mergesort(a), mergesort(b));
}
return c;
}
У меня есть 3 подозрения относительно этой реализации:
Как видите, b
указывает на третий элемент связанного списка. Я не знаю почему, потому что я думаю, что этого просто должно быть достаточно b = c->next
.
В l oop while
он также имеет b = b->next->next
, так как Насколько я понимаю, он продолжает указывать на четвертый элемент после c
в этом массиве. Это нормально, если я напишу b = b->next
?
Как я понимаю алгоритм mergesort
, он делит массив на два подмассива a
и b
, а затем выполняет сортировку слиянием каждый subarray рекурсивно, но я просто вижу, что он работает только с массивом b
. Что-то не так с этой реализацией?