java - 使用链表上的递归进行快速排序

标签 java sorting recursion linked-list

我必须在链接列表上使用递归进行快速排序......到目前为止我还不错,但是我遇到了一个小问题,我无法弄清楚为什么它不能正常工作.

这是对象节点:

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

最终结果应为C、D、P、R、Z。但由于某种原因,程序正在用 Z 替换另一个 R。代码有什么问题吗?

最佳答案

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

关于java - 使用链表上的递归进行快速排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5091168/

相关文章:

recursion - Coq新手: How to iterate trough binary-tree in Coq

java - Jenkins:Jenkins 未运行 TestNG 测试

java - 如何从 Java 控制台应用程序中的扫描器读取字符串?

php - 两行按时间顺序排序

php - 如果它在 php 中为空,如何以较低的顺序对空键和值进行排序

java - 使用冒泡排序和选择排序进行排序所需的时间

python - 如何重新实现这个递归函数?

java - 如何解决编辑条目和新条目的问题并反射(reflect)条目列表中的更改

java - Servlet/Undertow - 访问 HttpServletRequest 和 HttpServletResponse

function - 自定义 scala 递归预防机制的改进