2015-06-05 2 views
2

Я реализовал в своем коде одиночный список и мне нужно отсортировать список. Но мой код не работает, он работает в бесконечном цикле. Я должен сравнивать узлы в соответствии с их идентификатором в порядке возрастания.Отдельно связанный список bubble sort

Я не могу использовать массивы. Это моя реализация узла SLL.

class SLLNode implements Comparable<SLLNode> { 
    protected int id; 
    protected int plata; 
    protected SLLNode succ; 

    public SLLNode(int id,int plata, SLLNode succ) { 
     this.id = id; 
     this.plata=plata; 
     this.succ = succ; 
    } 

    @Override 
    public int compareTo(SLLNode o) { 
     return o.id - this.id; 
    } 
} 

public static void sort(SLL lista){ 
    SLLNode current; 
    boolean check = true; 
    while(check) { 
     current = lista.getFirst(); 
     check = false; 

     while(current.succ != null) 
     { 
      if(current.compareTo(current.succ) > 0) 
      { 
       SLLNode temp = current; 
       current=current.succ; 
       current.succ=temp; 
       check = true; 
      } 
      current = current.succ; 
     } 
    } 
} 
+0

FYI вы должны избегать пузырьковой сортировки. Это один из худших алгоритмов сортировки со сложностью O (n^2). _ «Хотя алгоритм прост, он слишком медленный и непрактичный для большинства проблем» _ https://en.wikipedia.org/wiki/Bubble_sort –

ответ

2

Вы проблема здесь:

  // Take a copy of current. 
      SLLNode temp = current; 
      // Step to next. 
      current=current.succ; 
      // Point temp (old current) to new next <----- Added this. 
      temp.succ = current.succ; 
      // Point next's successor to current. 
      current.succ=temp; 
      // Remember to check again. 
      check = true; 

Вы отсутствуют изменения temp.succ. Вам необходимо установить его на current.succ в соответствующем месте.

В итоге - поменять местами два узла а и б вам нужно сделать следующее:

  • Set a.succ = b.succ < --- Вы это пропустили.
  • Set b.succ = а

Без образца реализации вашего связанного списка, я не могу проверить это.

+0

Теперь он не застревает в бесконечном цикле, но он печатает только половину номера списка. – kirkharamiler

+0

@kirkharamiler - Это другая проблема. – OldCurmudgeon

+1

Что вы подразумеваете под разными проблемами. Это может быть какая-то другая проблема в реализации? – kirkharamiler

0

узел * sorted_list (узел * голова) {

node *index1,*index2; 
enter code here 
for(index1=head;index1->next!=NULL;index1=index1->next) 
{ 
for(index2=index1->next;index2!=NULL;index2=index2->next) 
{ 
if(index1->data>index2->data) 
{ 
int temp=index1->data; 
index1->data=index2->data; 
index2->data=temp; 
} 
} 
} 
return head; 

}