链表选择排序算法中的逻辑错误

时间:2014-05-02 00:56:37

标签: c++

我已经让它始终使用3个节点,但是当我将它提升到10个节点时,我得到了一个部分排序的堆栈。这个连接的链表类肯定能正常工作,到目前为止我已经使bubbleSort正常工作了。首先指向列表中的第一个节点,最后指向最后一个节点。 count是链表中的节点数。 firstNode是我用来保存排序列表的节点,因此它之前的任何内容都应该包含已排序的所有最小节点。我将它保存在已排序部分的最后一个节点上,这样我就可以在找到下一个节点时替换它的链接。我已经在纸上多次查看了这段代码,似乎无法找到错误。

template<class Type>
void unorderedLinkedList<Type>::selectionSort()
{
    nodeType<Type> *tempNode, *traverseNode, *preNode, *firstNode;
    tempNode=first; //initializing Nodes
    traverseNode = first;
    preNode = first;
    for (int i = 0; i < count - 1; i++) //loops 1 time for setting first Node
    {
        if (tempNode->info > traverseNode->link->info) // checks for smallest Node
        {
            preNode = traverseNode;
            tempNode = traverseNode->link;
        }
        traverseNode = traverseNode->link;
    }
    if (tempNode != first) //places smallest Node in position first
    {
        if (tempNode != last) //check if tempNode is last
            preNode->link = tempNode->link;
        else
        {
            preNode->link = NULL;
            last = preNode;
        }
        tempNode->link = first;
        first = tempNode;
    }

    firstNode = first;
    for (int iteration = 2; iteration < count; iteration++) //loop that should place element into the next slot each iteration
    {
        preNode = firstNode;
        tempNode = firstNode->link;
        for (int index = 0; index < count - iteration; index++) //loop that should find the smallest element
        {
            traverseNode = firstNode->link;
            if (traverseNode->link->info < tempNode->info) //checking if node is smaller
            {
                preNode = traverseNode;
                tempNode = traverseNode->link;
            }
            traverseNode = traverseNode->link; //traverse to next node
        }
        if (tempNode != last) //check if node is the last node  
            preNode->link = tempNode->link;
        else
        {
            preNode->link = NULL;
            last = preNode;
        }
        tempNode->link = firstNode->link; //node swap
        firstNode->link = tempNode;
        firstNode = firstNode->link;
    }
} //end selectionSort

1 个答案:

答案 0 :(得分:1)

这一行

traverseNode = firstNode->link;

需要在你的内部for循环之外(index上的那个)。否则,您总是只是在同一节点上进行比较。

编辑:当你不必交换节点时,你也错过了一个测试。你的第二个内循环和后续链接操作应该看起来像你的第一个循环(事实上,你可以简化并使用相同的代码)