簡體   English   中英

Java堆棧溢出錯誤?

[英]java stack overflow error?

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數組分成兩半,分別對每一半進行排序並將它們合並在一起來對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++;
        }
    }

逐步調試。 您將確切看到它如何導致無限遞歸。 IDE(Eclipse,IntelliJ)已內置它們。

問題是您對q的計算不正確。 它應該是pr之間的中間點,計算方法是:

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

要么

 q = (p + r) / 2;

但是你寫了:

 q = p + r / 2;

相當於

 q = p + (r / 2);

進行遞歸方法時,您需要一些基本情況,否則您將像現在一樣獲得無限遞歸。

在您的mergeSort方法中, 您沒有基本情況 您需要檢查一下要分類的零件是否已經被分類。 如果對word[p..r]進行了排序,則不應調用mergeSort

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM