пузырьковая сортировка связанный список не сортировка

0

Почему мой алгоритм сортировки пузырей не сортирует связанный список? Когда задан список и вызывается метод, он выдает тот же список. Что не так с моей текущей логикой внутри цикла 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;
        }

    }

}
  • 1
    Кажется, оператор присваивания: nextElement = NULL
  • 0
    Замените содержимое if на std::swap(current->data, nextElement->data) , это решит проблему.
Теги:
logic
linked-list
bubble-sort

2 ответа

1

Проблема вызвана назначением в for-loop вместо сравнения.

Если вы реализуете связанный список, могу ли я предложить использовать часовую, а не голову
и NULL как конец. Это удаляет все "угловые шкафы" во время вставок и удаляет.
Часовой узел всегда существует, не содержит данных, указывает на первый элемент,
и последний пункт указывает на это.

Могу ли я также предложить использовать Mergesort, он хорошо работает для связанного списка, работает в O (NlogN),
и не имеет места накладными расходами. Вы можете найти реализацию здесь

0

Попробуйте запустить его через отладчик. Если вы посмотрите на значение current во второй раз по сравнению с changed циклом, вы увидите, что current по-прежнему равен null, поэтому во второй раз по сравнению с changed циклом он не пройдет current цикл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню