Java 调用mergeSort方法时发生堆栈溢出错误

Java 调用mergeSort方法时发生堆栈溢出错误,java,stack-overflow,mergesort,Java,Stack Overflow,Mergesort,我一直在做这个问题: 我创建了一个接受随机数的文件,并将这些数字存储在SingleLinkedList数据结构中,我想执行mergeSort对这些随机数进行排序 对于较小的输入量,一切正常。 但是,当我插入10000个数字时,它开始在大约9800处出现“stack_overflow”错误(仅在显示数字时),当我插入10万个数字时,它工作正常,直到99700个数字,但随后它开始显示其余数字的错误 那么,这个错误背后的确切原因是什么(我知道这是因为它在递归函数中丢失了) 请帮助我,我无法跟踪导致此错

我一直在做这个问题:

我创建了一个接受随机数的文件,并将这些数字存储在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是的,你说得对!但这帮我跑了一段时间。如果您有任何其他建议,请分享-如如何避免堆栈溢出错误在这里。