我认为我对选择排序有基本的了解,但是由于某种原因它不起作用,我不知道为什么?有人知道这是怎么回事吗?
一些指针:
.getValue()只是返回节点中的对象,我使用的是整数。
Node tempNode = new Node(null,null,node.getValue()),第一个null表示前一个,第二个null表示下一个,第三个null设置节点中的对象,在这种情况下为整数。
我的输入是: 9 5 8 6 10 4
我的输出是这个。由于某种原因,它会不断重复设置4: 4 5 5 4 4 4
public void SelectionSort()
{
Node<T> node2;
Comparable temp;
Node<T> Nodemin;
for(Node<T> node = front;node != null; node = node.getNext())
{
Nodemin = node;
for(node2 = node.getNext();node2 != null; node2 = node2.getNext())
{
temp = node.getValue();
if(temp.compareTo(node2.getValue()) > 0)
{
Nodemin.setValue(node2.getValue());
}
Nodemin = Nodemin.getNext();
}
System.out.println(Nodemin.getValue());
Node<T> tempNode = new Node(null,null,node.getValue());
node.setValue(Nodemin.getValue());
Nodemin.setValue(tempNode.getValue());
}
}
答案 0 :(得分:0)
您说Nodemin = Nodemin.getNext();
时,是在将要交换的项目(所选项目)指向您的下限之上。我相信这会产生有害的副作用,当您进行交换时,您要在列表中后面输入的数字比交换时所输入的数字要多。
但是,随着您一直走在列表的下方并找到较小的数字,在设置Nodemin的值方面存在一个更细微的缺陷。因为Nodemin指向一个特定的位置,所以每次您找到一个新的最低元素时,您不仅在更改Nodemin的值,而且还更改了列表中某项的值,因为它们指向相同的位置。
我认为您可以通过将Nodemin更改为两个独立的事物来解决这两个问题,每个事物都可以满足您的要求。
让minValue像您的温度一样,仅跟踪minValue。让minLocation始终指向minValue所在的位置(永远不要在其下一行上进行操作,只需将其重置为找到新min的位置即可。)
然后,在内部for循环之外进行交换时,请在minLocation指向的位置并使用值minValue进行操作。
那应该解决它。或者它也应该取代
if(temp.compareTo(node2.getValue()) > 0)
{
Nodemin.setValue(node2.getValue());
}
Nodemin = Nodemin.getNext();
使用
if(temp.compareTo(node2.getValue()) > 0)
{
Nodemin = node2;
}
跟踪和调试的建议是不错的建议。我相信您会看到我在说什么的证据,并且会发现我犯的任何错误。