【问题标题】:Selection Sort on a Singly Linked List单链表上的选择排序
【发布时间】:2017-03-19 17:28:46
【问题描述】:

当我检查时,我找到了正确的最小值和前一个节点。之后我唯一需要做的就是交换节点,但是在执行此代码后,输出什么都没有。

画完问题后,我认为问题是已排序的部分。所以我又添加了一个名称已排序的节点,但我仍然无法解决我的问题。

这是我的示例代码:

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;
        }            
    }

【问题讨论】:

    标签: c# singly-linked-list selection-sort


    【解决方案1】:

    我将您代码中的一些变量重命名为更有意义的变量:

    • 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;
        }
    }
    

    【讨论】:

    • 我在您的代码中更改了一些内容,它开始起作用了。谢谢!而不是Nullnull。还有if (currentInner.Value.CompareTo(minimum.Value) &lt; 0),而不是'>'
    • @BatuhanAydın 我之前的解决方案有问题,所以我发布了一个不同的、更简单的解决方案。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 2016-02-21
    • 2016-01-18
    • 2012-04-12
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多