Почему мой алгоритм сортировки пузырей не сортирует связанный список? Когда задан список и вызывается метод, он выдает тот же список. Что не так с моей текущей логикой внутри цикла for?
private:
IntNode *head, *tail;
структура узла:
struct IntNode
{
int data;
IntNode * next;
};
метод сортировки пузырьков:
void NodeSLList::SortList()
{
if (head == NULL || head->next == NULL)
return;
IntNode * current = head;
IntNode * nextElement = current->next;
IntNode * temp = NULL;
int changed = 1;
while (changed)
{
changed = 0;
for (current; (current != NULL) && (nextElement = NULL); )
{
if (current->data > nextElement->data)
{
temp = current->next;
current->next = nextElement->next;
nextElement->next = temp;
changed = 1;
}
current = current->next;
nextElement = nextElement->next;
}
}
}
Проблема вызвана назначением в for-loop вместо сравнения.
Если вы реализуете связанный список, могу ли я предложить использовать часовую, а не голову
и NULL как конец. Это удаляет все "угловые шкафы" во время вставок и удаляет.
Часовой узел всегда существует, не содержит данных, указывает на первый элемент,
и последний пункт указывает на это.
Могу ли я также предложить использовать Mergesort
, он хорошо работает для связанного списка, работает в O (NlogN),
и не имеет места накладными расходами. Вы можете найти реализацию здесь
Попробуйте запустить его через отладчик. Если вы посмотрите на значение current
во второй раз по сравнению с changed
циклом, вы увидите, что current
по-прежнему равен null
, поэтому во второй раз по сравнению с changed
циклом он не пройдет current
цикл.
nextElement = NULL
if
наstd::swap(current->data, nextElement->data)
, это решит проблему.