我已经让它始终使用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
答案 0 :(得分:1)
这一行
traverseNode = firstNode->link;
需要在你的内部for循环之外(index
上的那个)。否则,您总是只是在同一节点上进行比较。
编辑:当你不必交换节点时,你也错过了一个测试。你的第二个内循环和后续链接操作应该看起来像你的第一个循环(事实上,你可以简化并使用相同的代码)