我认为我对选择排序有基本的想法,但是由于某种原因,它不起作用,我也不知道为什么?有人知道这里有什么问题吗?
一些提示:
.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());
}
}
最佳答案
说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;
}
跟踪和调试的建议是好的。我相信,您会看到我在说什么的证据,并发现我犯的任何错误。
关于java - 如何使用链表进行选择排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55908438/