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