2014-02-26 5 views
0

Я пытаюсь сортировать пузырьки для моего связанного списка, это не работает с первого раза, но если я вызову функцию дважды, она сортируется хорошо, для пример, если список: 9 8 7 6 5 4 3 2 1, сортировка возвращается 4 3 2 1 5 6 7 8 9! В чем тут ошибка?Сортировка пузырьков не работает с первого раза в связанном списке

void sort() { 

if(Head == NULL) 
    cout << "Sorry but your list is empty! \n"; 
else { 

    int i,j,temp,k = count(); 
    node *current,*nextNode; 

    for(i=0; i<k-1; i++,k--) { 
     current = Head; 
     nextNode = current->Next; 

     for(j = 1; j<k; j++) { 
      if(current->item > nextNode->item){ 
       temp = current->item; 
       current->item = nextNode->item; 
       nextNode->item = temp; 
      } 
      current = current->Next; 
      nextNode = nextNode->Next; 
     } 
    } 
    cout << "Sorting Succeeded!\n"; 
} 
} 
+0

Я беру это из кода подкачки, это не об обмене узлами в связанном списке, а их содержащихся значениях. Я объясняю это только потому, что большинство структур данных и алгоритмов не используют связанный список для академических наук bubblesort, если вы специально не * предположили, что должны менять прямые значения, а вместо этого заменяете позиции в списке содержащихся узлов (задача, которая значительно отличается от сделанного здесь). – WhozCraig

ответ

0

Измените следующие 2 строки

for(i=0; i<k-1; i++,k--) { 

for(j = 1; j<k; j++) { 

к

for(i = 0; i < (k - 1); i++) { 

for(j = 0; j < (k - i - 1); j++) { 
+0

Ничего себе! Но можете ли вы рассказать мне, как вы думали об этом состоянии цикла? –

+0

Я оставлю это вам :), используйте отладчик и пройдите через каждую итерацию и проверьте значения каждой переменной на каждом шагу, вы поймете это. Если вы этого не сделаете, я объясню. – user376507

1

Не увеличивает i. Поскольку j начинается с 1, так i всегда следует начинать цикл от 0
Изменить for(i=0; i<k-1; i++,k--)
в for(i=0; i<k-1; k--)

for(i=0; i<k-1; i++,k--) должен работать K-1 раз. Но когда вы увеличиваете i и декрементируете k, тогда разница между i и k уменьшается с удвоенной скоростью, поэтому она запускает k/2 раз, и поэтому сортируются только k/2. И при повторном запуске, остальные k/2 элементов также сортируются.

+0

Немного яснее: 'for (k = count(); k> 1; -k)' – stefaanv

+0

Вы правы, я попытался выполнить минимальное редактирование, чтобы поддерживать близость к OP. –

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