如何使用链表进行选择排序

时间:2019-04-29 17:45:06

标签: java

我认为我对选择排序有基本的了解,但是由于某种原因它不起作用,我不知道为什么?有人知道这是怎么回事吗?

一些指针:

.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());

      }
  }

1 个答案:

答案 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;


          } 

跟踪和调试的建议是不错的建议。我相信您会看到我在说什么的证据,并且会发现我犯的任何错误。