java堆栈溢出错误?

时间:2014-07-11 02:21:01

标签: java unix recursion stack-overflow

Exception in thread "main" java.lang.StackOverflowError
at Search.mergeSort(Search.java:41)
at Search.mergeSort(Search.java:43)
at Search.mergeSort(Search.java:43)
at Search.mergeSort(Search.java:43)
at Search.mergeSort(Search.java:43)

我尝试运行程序时遇到此错误。我的程序应该从文件中获取字符串输入并使用此算法对其进行排序。有任何想法吗?来自代码的有问题的行:

public static void mergeSort(String[] word, int p, int r){
int q;
if(p<r){
q=p+r/2;
mergeSort(word,p,q);
mergeSort(word, q+1,r);
merge(word, p, q, r);
}
}

修改

这两个函数通过将数组分成两半来对String数组进行排序,分别对每一半进行排序,并将它们合并在一起。 Int q是中间点,被评估的数组是从word [p]到word [q]和word [q + 1]到word [r]。这是合并功能:

public static void merge(String[] word, int p, int q, int r){
    int n1 = q-p+1;
    int n2 = r-q;
    String[] L = new String[n1];
    String[] R = new String[n2];
    int i, j, k;

    for(i=0; i<n1; i++) L[i] = word[p+i];
    for(j=0; j<n2; j++) R[j] = word[q+r+1];
    i=0; j=0;
    for(k=p; k<=r; k++){
        if(i<n1 && j<n2){
            if(L[i].compareTo(R[j])<0){
                word[k] = L[i];
                i++;
            }else{
                word[k] = R[j];
                j++;
            }
        }else if(i<n1){
            word[k] = L[i];
            i++;
        }else if(j<n2){
            word[k] = R[j];
            j++;
        }
    }

3 个答案:

答案 0 :(得分:2)

使用调试器。你会看到它究竟是如何导致无限递归的。 IDE(Eclipse,IntelliJ)内置了它们。

答案 1 :(得分:0)

问题是您对q的计算不正确。它应该是pr之间的中间点,计算方法是:

 q = p + (r - p) / 2;

 q = (p + r) / 2;

但你写了:

 q = p + r / 2;

相当于

 q = p + (r / 2);

答案 2 :(得分:0)

在制作递归方法时,您需要一些基本情况,否则您将获得无限递归,就像您现在一样。

mergeSort方法中,您没有基本案例。您需要办理登机手续,查看您排序的部分是否已经排序;如果word[p..r]已排序,则您不应该致电mergeSort