2014-11-15 5 views
0

Почему мой алгоритм сортировки пузырей не сортирует связанный список? Когда задан список и вызывается метод, он выдает тот же список. Что случилось с моей текущей логикой внутри цикла for? Структура узлаbubble сортировать связанный список не сортировать

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' – AlexD

+0

Замените содержимое' if' на 'std :: swap (current-> data, nextElement-> data)', это будет решить проблему. – dasblinkenlight

ответ

0

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

1

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

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

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

Смежные вопросы