2015-12-03 2 views
2

Мне нужно разобраться в LinkedList, но я не могу понять, почему он только сортирует его один раз, а затем останавливается. Мне трудно понять общие типы и как их использовать. Большинство примеров, которые я нашел, касались сортировки целых массивов, но я все еще не мог перевести эти примеры в мой метод сортировки. Все, что могло бы помочь мне понять, как сортировать это, было бы весьма полезно.Сортировка общего LinkedList

public void sort() { 

    Node<T> current = head; 

    while(current != null){ 
     if(current.getNext()!=null && current.getItem().compareTo(current.getNext().getItem()) < 0){ 
      T temp = current.getItem(); 
      current.setItem(current.getNext().getItem()); 
      current.getNext().setItem(temp); 
     } 
     current = current.getNext(); 
    } 
    current = head; 
} 

Вот мой LinkedList класс

public class LinkedList<T extends Comparable<T>> implements LinkedList161<T> { 

    protected Node<T> head; 
    protected int size; 

    public LinkedList() { 
     head = null; 
     size = 0; 
    } 

    public void add(T item, int index) { 
     if(index < 0 || index > size){ 
      throw new IndexOutOfBoundsException("out of bounds"); 
     } 
      if(index == 0){ 
       head = new Node<T>(item, head); 
      } 
      else{ 
       Node<T> current = head; 
       for(int i = 0; i < index -1; i ++){ 
        current = current.getNext(); 
       } 
       current.setNext(new Node<T>(item, current.getNext())); 
      } 
      size++; 
     } 


    public void addFirst(T item) { 
     head = new Node<T>(item, head); 
     size++; 
    } 

    public void addToFront(T item) { 
      head = new Node<T>(item, head); 
      size++; 
     } 

     public void addToBack(T item) { 

      if(head == null){ 
       head = new Node<T>(item); 
       size++; 
      } 
      else{ 
       Node<T> temp = head; 
       while(temp.getNext() != null){ 
        temp = temp.getNext(); 
       } 
       temp.setNext(new Node<T>(item)); 
       size++; 
      }  

     } 

     public void remove(int index) { 

      if(index < 0 || index > size){ 
       System.out.println("Index out of bounds"); 
      } 
      if(index == 0){ 
       head = head.getNext(); 
      }else{ 
       Node<T> current = head; 
       for(int i = 0; i < index;i++){ 
        current = current.getNext(); 
       } 
       current.setNext(current.getNext().getNext()); 
      } 
      size--; 
     } 

     public T get(int index){ 

      Node<T> p = head; 

      for(int i = 0; i < index;i++){ 
       p = p.getNext(); 
      } 
      return p.getItem(); 
     } 

     public void clear() { 
      head = null; 
      size = 0; 

     } 

     public int size() { 
     return size; 

     } 

    @Override 
    public String toString() { 

     String result = ""; 
     if (head == null) 
      return result; 
     for (Node<T> p = head; p != null; p = p.getNext()) { 
      result += p.getItem() + "\n"; 
     } 
     return result.substring(0,result.length()-1); // remove last \n 
    } 

@Override 
public void sort() { 

    Node<T> current = head; 

    for(int i = 0; i < size;i++){ 
     if(current.getNext()!=null && current.getItem().compareTo(current.getNext().getItem()) < 0){ 
      T temp = current.getItem(); 
      current.setItem(current.getNext().getItem()); 
      current.getNext().setItem(temp); 
     } 
     current = current.getNext(); 
    } 
    current = head; 
} 
} 

Вот мой класс Node

public class Node<T> implements Node161<T>{ 
protected T item; 
protected Node<T> next; 

public Node(T item, Node<T> next) { 
    setItem(item); 
    setNext(next); 
} 

public Node(T item) { 
    setItem(item); 
} 

public T getItem() { 
    return item; 
} 

public void setItem(T i) { 
    item = i; 
} 

public void setNext(Node<T> n) { 
    next = n; 
} 

public Node<T> getNext() { 
    return next; 
} 

@Override 
public String toString() { 
    return item.toString(); 
} 
} 

ответ

0

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

Обратите внимание, что этот алгоритм неэффективен. Вы должны посмотреть на более сложный подход, например: merge sort

+0

Означает ли это, что-то не так с тем, как я сделал свое время цикла? Я думаю, что обменный код делает то, что он должен делать, по крайней мере. –

+0

Хотя цикл правильный, но этого недостаточно для сортировки всего списка за один раз. Swapping выглядит правильно – Nyavro

+0

Да, вот где я застрял. Я думал, что цикл будет проходить до тех пор, пока current.getNext() не будет равен нулю. Я не понимаю, почему это остановится только через один раз, так как я говорю ему использовать current.getNext() внутри цикла. –

0

В статье сортировки wiki-merge теперь имеется простая, но быстрая сортировка слияния снизу вверх для связанных списков, которая использует малый массив (обычно от 26 до 32) указателей на первые узлы list, где array [i] является либо нулевым, либо указывает на список размера 2 на мощность i. В отличие от некоторых других подходов, нет сканирования списков, вместо этого массив используется вместе с общей функцией слияния, которая объединяет два уже отсортированных списка. Ссылка на статью:

http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists

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