簡體   English   中英

MergeSort實現提供了StackOverflow

[英]MergeSort Implementation gives StackOverflow

我一直在嘗試實現一個MergeSort,它將數組分為三個部分而不是兩個部分。 我似乎在某個地方遇到了StackOverflow異常。 有人可以幫我找到它嗎? (SO在第54、58、59行上報告)

導入java.util。 ; 導入java.io。 ;

MergeSortQuestion類{

// merges sorted subarrays A[start...firstThird], A[firstThird+1,secondThird], and A[secondThird+1,stop]
public static void mergeThreeWay(int A[], int start, int firstThird, int secondThird, int stop) 
{

    int indexLeft = start;
    int indexFirstThird = firstThird+1;
    int indexSecondThird = secondThird+1;
    int tmp1[] = new int[A.length];
    int tmpIndex = start;
    while(tmpIndex <= firstThird){

        if (indexFirstThird < firstThird || (indexLeft <= firstThird && A[indexLeft] <= A[indexFirstThird])){

            tmp1[tmpIndex] = A[indexLeft];
            indexLeft++;

        }else if(indexSecondThird < secondThird || (indexFirstThird <= secondThird && A[firstThird] <= A[indexSecondThird])){

            tmp1[tmpIndex] = A[indexFirstThird];
            indexFirstThird++;

        }else{

            tmp1[tmpIndex] = A[indexSecondThird];
            indexSecondThird = indexSecondThird + 1;

        }

        tmpIndex++;
    }

    int i = 0;

    for(int temp : tmp1){
        A[i] = temp;
        i++;
    }



}



// sorts A[start...stop]
public static void mergeSortThreeWay(int A[], int start, int stop) {

    if (start < stop){

        int firstThird = (start+stop)/3;
        int secondThird = 2*(firstThird);
        mergeSortThreeWay(A, start, firstThird);
        mergeSortThreeWay(A, firstThird+1, secondThird);
        mergeSortThreeWay(A, secondThird+1, stop);
        mergeThreeWay(A, start, firstThird, secondThird, stop);
    }


}


public static void main (String args[]) throws Exception {

int myArray[] = {8,3,5,7,9,2,3,5,5,6}; 

mergeSortThreeWay(myArray,0,myArray.length-1);

System.out.println("Sorted array is:\n");
for (int i=0;i<myArray.length;i++) {
    System.out.println(myArray[i]+" ");
}
}

}

您的firstThirdsecondThird變量在mergeSortThreeWay執行過程中的某個時刻不會將值從一次迭代更改為另一次迭代。 在您的示例中,我得到了:

start=4 stop=6
firstThird=3 secondThird=6
start=4 stop=6
firstThird=3 secondThird=6
// so java.lang.StackOverflowError

計算firstThirdsecondThird的公式似乎不起作用。 嘗試使用

firstThird = (stop-start)/3 + start;
secondThird = 2*(stop-start)/3 + start;

暫無
暫無

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

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