Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在链表上使用递归进行快速排序_Java_Sorting_Recursion_Linked List - Fatal编程技术网

Java 在链表上使用递归进行快速排序

Java 在链表上使用递归进行快速排序,java,sorting,recursion,linked-list,Java,Sorting,Recursion,Linked List,我必须在链表上使用递归进行快速排序。。。。到目前为止,我还可以,但是我遇到了一个小问题,我看不出它为什么不能正常工作 以下是对象节点: public class Node { String name; Node next; } 以下是程序代码: public class QuickSortRecusionLinkedList { public static void quickS(int start, int fini

我必须在链表上使用递归进行快速排序。。。。到目前为止,我还可以,但是我遇到了一个小问题,我看不出它为什么不能正常工作

以下是对象节点:

    public class Node
    {
      String name;
      Node next;
    }
以下是程序代码:

    public class QuickSortRecusionLinkedList
    {
      public static void quickS(int start, int finish, Node head, Node tail)
      {
        int left = start;
        int right = finish;
        Node pivot = head;
        for(int i = 0; i < ((left+right)/2); i++)
        {
          pivot = pivot.next;
        }
        Node temp = new Node();
        Node leftN = head;
        Node rightN = head;

        while(right > left)
        {
          leftN = head;
          for(int i = 0; i < left; i++)
          {
            leftN = leftN.next;
          }
          while ((leftN.name).compareToIgnoreCase((pivot.name))<0)
          {
            left = left + 1; 
            leftN = leftN.next;
          }
          rightN = head;
          for(int i = 0; i < right; i++)
          {
            rightN = rightN.next;
          }
          while ((pivot.name).compareToIgnoreCase((rightN.name))<0)
          {
            right = right - 1;
            rightN = head;
            for(int i = 0; i < right; i++)
            {
              rightN = rightN.next;
            }
          }

          if ( left <= right
             )
          {
            temp.name = leftN.name;
            leftN.name = rightN.name;
            rightN.name = temp.name;

            left = left +1;
            leftN = leftN.next;

            right = right -1;
            rightN = head;
            for(int i = 0; i < right; i++)
            {
              rightN = rightN.next;
            }

            int size = 1;
            temp = head;
            while (temp!=tail)
            {
              temp = temp.next;
              size++;
            }
            temp = head;
            while(temp != tail)
            {
              System.out.print(temp.name + ", ");
              temp = temp.next;
            }
            System.out.println(tail.name + ".");
          }
        }

        if(start < right) 
          quickS(start, right, head, tail);
        if(left < finish) 
          quickS(left, finish, head, tail);
      }

      public static void main(String[] args)
      {
        Node head = new Node();
        Node tail = new Node();
        Node a = new Node();
        Node b = new Node();
        Node c = new Node();

        head.name = "R";
        tail.name = "D";
        a.name = "Z";
        b.name = "C";
        c.name = "P";

        head.next = a;
        a.next = b;
        b.next = c;
        c.next = tail;

        int size = 0;
        Node temp = head;
        while (temp!= tail)
        {
          temp = temp.next;
          size++;
        }

        quickS(0,size,head,tail);
      }

    }


最终结果应该是
C、D、p、R、Z
。但出于某种原因,该程序正在用另一个
R
替换
Z
。代码有什么问题

可能提示:当您使用
temp
变量交换名称时,请小心该变量所指向的对象。

可能提示:当您使用该变量交换名称时,请小心该
temp
变量所指向的对象。

关于这一点,这似乎是一件傻事。链接列表上的Quiksort不会很快。它的全部思想是使用数组。这里的目的是什么?

恕我直言,这似乎是愚蠢的差事。链接列表上的Quiksort不会很快。它的全部思想是使用数组。这里的目的是什么?

重新格式化代码或粘贴它。使用调试器时,您会看到什么?首先,我不知道如何编辑代码,使其正常,而不是像我现在看到的那样所有的wierd。。。这是我能做的最好的了对不起,这是家庭作业吗?如果没有,为什么不直接使用集合。排序?这是了解调试器的好机会。重新格式化代码或粘贴它。使用调试器时,您会看到什么?首先,我不知道如何编辑代码以使其正常,而不是像我现在看到的那样所有的wierd。。。这是我能做的最好的了对不起,这是家庭作业吗?如果没有,为什么不直接使用Collections.sort?这是了解调试器的好机会。谢谢johusman!在我放置temp=new Node()之后,它工作得非常好;在交换之前。。。谢天谢地,帮助人们做家庭作业让人觉得有点脏,但这实际上与快速排序算法本身无关,只是一个愚蠢的疏忽:)你几乎没有为他做家庭作业!你刚刚指出了一个[小]逻辑错误谢谢johusman!在我放置temp=new Node()之后,它工作得非常好;在交换之前。。。谢天谢地,帮助人们做家庭作业让人觉得有点脏,但这实际上与快速排序算法本身无关,只是一个愚蠢的疏忽:)你几乎没有为他做家庭作业!你刚才指出了一个[小]逻辑错误
C, Z, R, P, D.
C, Z, R, P, D.
C, D, R, P, Z.
C, D, P, R, R.
C, D, P, R, R.
C, D, P, R, R.