我认为我对选择排序有基本的想法,但是由于某种原因,它不起作用,我也不知道为什么?有人知道这里有什么问题吗?

一些提示:

.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/

10-11 04:49