Java 调用mergeSort方法时发生堆栈溢出错误
我一直在做这个问题: 我创建了一个接受随机数的文件,并将这些数字存储在SingleLinkedList数据结构中,我想执行mergeSort对这些随机数进行排序 对于较小的输入量,一切正常。 但是,当我插入10000个数字时,它开始在大约9800处出现“stack_overflow”错误(仅在显示数字时),当我插入10万个数字时,它工作正常,直到99700个数字,但随后它开始显示其余数字的错误 那么,这个错误背后的确切原因是什么(我知道这是因为它在递归函数中丢失了) 请帮助我,我无法跟踪导致此错误的问题 以下是我的主要方法代码:Java 调用mergeSort方法时发生堆栈溢出错误,java,stack-overflow,mergesort,Java,Stack Overflow,Mergesort,我一直在做这个问题: 我创建了一个接受随机数的文件,并将这些数字存储在SingleLinkedList数据结构中,我想执行mergeSort对这些随机数进行排序 对于较小的输入量,一切正常。 但是,当我插入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;
}
}
这是我的排序方法代码:
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;
}
}
public void排序(节点n){
节点tmp=n;
合并排序(tmp);
}
节点a;
节点b;
公共void合并排序(节点头ref){
节点head1=headRef;
if(head1==null | | head1.next==null){
回来
}
系统输出打印(“hi…”);
节点Euler=拆分列表(head1);
打印列表(欧拉);
}
/*对链接列表执行合并排序*/
公共节点拆分列表(节点头1){
节点慢;
节点快速;
左、右淋巴结;
if(head1==null | | head1.next==null){
左=头1;
右=空;
返回头1;
}
否则{
慢=头1;
fast=head1.next;
while(快速!=null){
fast=fast.next;
如果(快速!=null){
slow=slow.next;
fast=fast.next;
}
}
左=头1;
右=慢。下一步;
slow.next=null;
}
返回分拣机(拆分列表(左)、拆分列表(右));
}
/*合并列表*/
公共节点分拣机(节点a、节点b){
节点结果=null;
如果(a==null){
返回b;
}
else如果(b==null){
返回a;
}
如果(a.数据
您是否考虑过使用JDK中的Collections.sort()进行合并排序?Java 8还有一个并行排序,它执行并行合并排序。我想给您一个更新
通过改变堆栈大小,我确实能够正确运行我的程序。
原因是什么
线程“main”java.lang.StackOverflowerr中的异常是因为它超出了堆栈大小
所以我四处寻找,得到了这个解决方案
转到项目属性-内部运行,转到VM选项并将其放入参数-Xss100m中以使其运行!
现在它可以对100多万个数字进行排序:D
欢迎提供其他建议/解决方案。希望获得有关堆栈溢出错误的帮助。。。讽刺是强烈的@Alexandrebaudet哈哈哈!是的,我在另一个问题中尝试了Collection.sort()。但我想尝试一下这种方法。这不是一种解决方案,而是一种变通方法。你没有解决问题,只是推迟了。@Ricky是的,你说得对!但这帮我跑了一段时间。如果您有任何其他建议,请分享-如如何避免堆栈溢出错误在这里。