2016-11-06 7 views
0

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

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

Вот мой пример кода:

public void selectionSort() 
{    
    Node<T> first = head; 
    Node<T> previous = head; 
    Node<T> minimum = head; 
    Node<T> compare; 
    Node<T> temp; 
    Node<T> sorted = head;   
    while (first.Next != null) 
    { 
     sorted = minimum; // with this I'm finding the last sorted node 
     minimum = first; 
     compare = first.Next; 
     while (compare.Next != null) 
     { 
     if (minimum.Value.CompareTo(compare.Next.Value) > 0) 
     { 
      previous = compare; // Need previous node to changing connections 
      minimum = compare.Next; // Saving minimum value 
     } 
     compare = compare.Next; 
     } 
     // Swapping nodes 
     temp = first; 
     previous.Next = first; 
     first.Next = minimum.Next; 
     minimum.Next = temp.Next; 
     if (temp != head) 
     { 
      sorted.Next = minimum; // Adding minimum node to sorted part 
     } 
      first = first.Next; 
     }    
    } 

ответ

0

Я переименовал некоторые переменные в коде более значимые из них:

  • currentOuter отслеживает текущий узел во внешнем контуре
  • currentInner отслеживает текущий узел во внутреннем контуре

Перекачка по значению/данных, а не узлами упрощает код много:

public void selectionSort<T>(Node<T> head) where T:IComparable 
{ 
    Node<T> currentOuter = head; 

    while (currentOuter != null) 
    { 
     Node<T> minimum = currentOuter; 
     Node<T> currentInner = currentOuter.Next; 

     while (currentInner != null) 
     { 
      if (currentInner.Value.CompareTo(minimum.Value) < 0) 
      { 
       minimum = currentInner; 
      } 

      currentInner = currentInner.Next; 
     } 

     if (!Object.ReferenceEquals(minimum, currentOuter)) 
     { 
      T temp = currentOuter.Value; 
      currentOuter.Value = minimum.Value; 
      minimum.Value = temp; 
     } 

     currentOuter = currentOuter.Next; 
    } 
} 
+0

я изменил в своем коде несколько вещей, он начал work.Thank вас! Вместо 'Null',' null'.Also 'if (currentInner.Value.CompareTo (minimum.Value) <0)', вместо '>' –

+0

Исправлено это, спасибо! –

+0

@ BatuhanAydın Была проблема с моим предыдущим решением, поэтому я опубликовал другой, более простой. См. Мой обновленный ответ. –