我一直在做这个问题:
我创建了一个使用随机数的文件,并将这些数字存储在SinglyLinkedList数据结构中,我想执行合并排序来对这些随机数进行排序。
对于较小的输入量,一切都很好。但当我插入10000个数字时,它在9800个数字左右(仅显示数字)开始出现"stack_overflow"错误,当我插入10万个数字时——它一直工作到99700个数字,但随后它开始显示其余数字的错误。
那么这个错误背后的确切原因是什么(我知道这是因为它在递归函数中丢失了)请帮我一下,我无法跟踪导致此错误的问题。
这是我的主要方法代码:
FileReader fr = new FileReader("C://my_folder//file_List.txt");
BufferedReader br = new BufferedReader(fr);
LinkedListNode lln = new LinkedListNode();
String str;
while((str=br.readLine())!=null){
/* This insertAtEnd appends the number to the SinglyLinkedList*/
lln.insertAtEnd(Integer.parseInt(str));
System.out.println(" "+str);
}
/*This method displays the elements of a LinkedList*/
Node res = lln.traverse();
System.out.println("n");
mergeSortLinkedList ms = new mergeSortLinkedList();
ms.sort(res);
这是我的排序方法代码:
public void sort(Node n){
Node tmp = n;
MergeSort(tmp);
}
Node a;
Node b;
public void MergeSort(Node headRef){
Node head1 = headRef;
if(head1 == null || head1.next == null){
return;
}
System.out.print("hi..");
Node Euler = splitList(head1);
printList(Euler);
}
/* perform merge sort on the linked list */
public Node splitList(Node head1){
Node slow;
Node fast;
Node left, right;
if(head1 == null || head1.next == null){
left = head1;
right = null;
return head1;
}
else{
slow = head1;
fast = head1.next;
while(fast!=null){
fast = fast.next;
if(fast!=null){
slow = slow.next;
fast = fast.next;
}
}
left = head1;
right = slow.next;
slow.next = null;
}
return SortedMerge(splitList(left),splitList(right));
}
/* merge the lists.. */
public Node SortedMerge(Node a, Node b){
Node result = null;
if(a == null){
return b;
}
else if( b == null){
return a;
}
if(a.data < b.data){
result = a;
result.next = SortedMerge(a.next, b);//getting error at this line
}
else{
result = b;
result.next = SortedMerge(a,b.next);//getting error at this line
}
return result;
}
public void printList(Node Euler){
System.out.println("nPrinting sorted elements");
Node Ref = Euler;
int count = 0;
while(Ref!=null){
count++;
System.out.println(count+"-"+Ref.data);
Ref = Ref.next;
}
}
您是否考虑过使用JDK中的Collections.sort(),它将执行合并排序?Java8还有一个parallelSort,它可以进行并行合并排序。
我想给你一个更新。
通过改变堆栈大小,我确实能够正确地运行我的程序。它造成的原因Exception in thread "main" java.lang.StackOverflowError
是因为它超出了堆栈大小。
所以我四处寻找,找到了这个解决方案。
转到项目属性-内部运行,转到VM选项并将其放入参数-Xs100m中以使其运行!现在它可以对100多万个数字进行排序:D
欢迎其他建议/解决方案。