Stack_Overflow_error 在调用 mergeSort 方法时

Stack_Overflow_error while calling mergeSort method

我一直在做这道题:

我创建了一个包含随机数的文件,并将这些数字存储在 SinglyLinkedList 数据结构中,我想执行 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;
    }
}

您是否考虑过使用 JDK 中的 Collections.sort() 来进行合并排序? Java 8 还有一个并行排序的 parallelSort。

我想给你更新。

通过更改堆栈大小,我确实能够 运行 我的程序正常运行。 它造成的原因 Exception in thread "main" java.lang.WhosebugError 是因为它超出了堆栈大小。

所以我四处搜索并得到了这个解决方案。

转到项目属性 - 在 运行 中,转到 VM 选项并将其放入参数 -Xss100m 中以使其成为 运行! 现在它能够对超过 100 万个数字进行排序 :D

欢迎提出其他建议/解决方案。