调用mergeSort方法时发生Stack_Overflow_error



我一直在做这个问题:

我创建了一个使用随机数的文件,并将这些数字存储在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

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

最新更新