Java 双链表快速排序

Java 双链表快速排序,java,quicksort,doubly-linked-list,Java,Quicksort,Doubly Linked List,我在快速排序程序中的交换方法有问题。我是通过一种对数组进行排序的快速排序方法来实现它的。在这里,我接收一个每行都有一个整数的文件,它将数字放入一个双链接列表中,然后对列表进行排序并输出到一个新文件。我需要有关swap方法的帮助,以及我需要添加或执行哪些操作才能使其正常工作。任何建议都会有帮助,最好是举个例子。多谢各位 //swap A[pos1] and A[pos2] public static void swap(DList A, int pos1, int pos2){

我在快速排序程序中的交换方法有问题。我是通过一种对数组进行排序的快速排序方法来实现它的。在这里,我接收一个每行都有一个整数的文件,它将数字放入一个双链接列表中,然后对列表进行排序并输出到一个新文件。我需要有关swap方法的帮助,以及我需要添加或执行哪些操作才能使其正常工作。任何建议都会有帮助,最好是举个例子。多谢各位

    //swap A[pos1] and A[pos2]
   public static void swap(DList A, int pos1, int pos2){
      int temp = A.get(pos1); 
      A[pos1] = A[pos2]; 
      A[pos2] = temp; 
   }
我的整个快速排序程序如下所示:

import java.util.*;
import java.io.*;

public class Test_QuickSort{

   private static Scanner input = new Scanner(System.in); 
   private static DList list = new DList(); 

   public static void main(String[] args) throws FileNotFoundException
   {
      input = new Scanner(new File("data.txt"));

      while (input.hasNext())
      {
         String s = input.nextLine();
         DNode g = new DNode(Integer.parseInt(s));
         list.addLast(g);
      }
   //int[] A = {1,4,6,2};  

   QuickSort(list, 0, list.size()-1);

   //for(int i = 0; i < A.length; i++)
   //    System.out.print(A[i] + " ");

   }

   public static void QuickSort(DList A, int left, int right){
      if(left >= right)
         return; 

      int pivot_index = partition(A, left, right); 
      QuickSort(A, left, pivot_index - 1);
      QuickSort(A, pivot_index + 1, right);
   }

   public static int partition(DList A, int left, int right){
      int pivot = A.get(right); 
      int index = left; 

      for(int i = left; i < right; i++){
         if(A.get(i) <= pivot){
            swap(A, index, i);
            index ++; 
         }
      }
      swap(A, index, right);
      return index; 
   }


    //swap A[pos1] and A[pos2]
   public static void swap(DList A, int pos1, int pos2){
      int temp = A.get(pos1); 
      A[pos1] = A[pos2]; 
      A[pos2] = temp; 
   }

}
import java.util.*;
导入java.io.*;
公共类测试快速排序{
专用静态扫描仪输入=新扫描仪(System.in);
私有静态数据列表=新建数据列表();
公共静态void main(字符串[]args)引发FileNotFoundException
{
输入=新扫描仪(新文件(“data.txt”);
while(input.hasNext())
{
字符串s=input.nextLine();
DNode g=新的DNode(Integer.parseInt(s));
列表。添加最后一个(g);
}
//int[]A={1,4,6,2};
快速排序(list,0,list.size()-1);
//for(int i=0;i=右)
回来
int pivot_index=分区(A、左、右);
快速排序(A,左,轴索引-1);
快速排序(A,透视索引+1,右);
}
公共静态整型分区(数据列表A,整型左,整型右){
int pivot=A.get(右);
int索引=左;
for(int i=左;i<右;i++){

如果(A.get(i)您总是在
DList.get
中检索同一元素的原因是您在第一次迭代后停止循环。只需删除
break
-语句,循环就会按预期工作

public int get(int pos)
{
    DNode current = new DNode();
    for(int i = 0; i <= pos && current != null; i++)
    {
        if(pos == 0){
            current = header;
        }
        else{
            current = current.next;
            // break; <-- remove this
        }
    }
    return current.element;
}
现在,关于您的
swap
-方法:如前所述,您尝试通过尝试使用方括号取消对元素的引用,将
DList
的实例视为一个数组。相反,您应该在
DList
中实现一个方法,该方法允许在特定位置设置元素。例如:

public void setAt(int pos, int value){
    DNode current = header;
    for(int i = 1; i <= pos && current != null; i++){
        current = current.next;
    }
    if(current != null)
        current.setElement(value);
    else
        throw new IndexOutOfBoundsException();
}

任何帮助都是很棒的?你能详细说明哪些不起作用-实际的行为是什么?你期望什么行为?“我需要帮助…”不是很精确。编辑:显然,您希望将
DList
的实例作为数组处理,这在Java中是不可能的。您可能希望实现一种方法,在某个索引处添加一个值,例如
setValueAt(int index,int value)
并将该值设置为
a.setValueAt(pos1,a.getValueAt(pos2)
。如果你把问题说得更具体一些,我会很高兴仔细看看。@KuluLimpa我知道我的get方法工作不正常,因为无论传入什么,我都会得到相同的值。而且,我的swap方法不正确。我正在寻求帮助更新我的程序。好的,这更有意义。一个问题,当我调试我的pro时gram,我注意到我的双链接列表最初创建了0,0,并从中添加。因此,无论我的列表包含什么,都将包含0,0。我试图将元素的初始值设置为null,但出现了一个错误。有什么建议吗?再次感谢您得到了什么错误?
NullPointerException
?编辑:另外,Java正在初始化引用类型设置为
null
,原语值设置为
0
,因此,如果您有一个字段
元素
,并且没有显式设置它,那么Java会将其设置为
0
。如果我在我的DNode()中设置元素=null它表示不可比较的类型。我希望避免使用零,并获得从文件中传入的严格整数列表。不确定这是否可行。@ProgrammingAppy这是因为
元素
的类型为
int
。Java区分基本类型(
int
double
float
long
byte
char
)和引用类型(其他所有类型,包括数组-因此
int[]
也是引用类型).
null
是一种特殊引用,只能分配给引用类型的值。请进一步注意,您不能取消对
null
的引用,并且尝试这样做将导致
NullPointerException
。编辑:如果需要,您可以将
元素
初始化为任何(有效)数字,例如
1
public int get(int pos)
{
    DNode current = header;
    for(int i = 1; i <= pos && current != null; i++)
    {
        current = current.next;
    }
    return current.element;
}
public void setAt(int pos, int value){
    DNode current = header;
    for(int i = 1; i <= pos && current != null; i++){
        current = current.next;
    }
    if(current != null)
        current.setElement(value);
    else
        throw new IndexOutOfBoundsException();
}
public static void swap(DList a, int pos1, int pos2){
    int temp = a.get(pos1);
    a.setAt(pos1, a.get(pos2)); 
    a.setAt(pos2, temp); 
}