我的MergeSort没有阅读右侧

时间:2014-03-20 15:21:28

标签: java sorting recursion mergesort

我的MergeSort代码没有读右边。 我认为问题必须出在MergeSort的递归上。如果我把正确的部分:MergeSort(S,(q + 1),last);在另一次递归之前,它不是在读取左侧。这是我的代码:

first = 0;
last = S.length;
// START - MergeSort

public static int[] MergeSort(int[] S,int first,int last){
    if(first<last){
        int q = (first+last)/2;
        MergeSort(S,first,q);
        MergeSort(S,(q+1),last);
        Merge(S,first,q,(q+1),last);
    }
    return S;
}

public static void Merge(int[] S,int first1,int last1,int first2,int last2){

    int N = last1 - first1 + 1;
    int M = last2 - first2 + 1;
    int Total = N+M-1;

    int[] A = new int[N];
    int[] B = new int[M];
    int[] C = new int[Total];

    int posA=0;
    int posB=0;
    int posC=0;

    for(int i=first1; i<N; i++){
        A[i] = S[i];
    }

    for(int i=first2; i<M; i++){
        B[i] = S[i];
    }

    while(posA<N && posB<M){
            if(A[posA]<B[posB]){
                C[posC]=A[posA];
                posA++;
                posC++;
            }
            else{
                C[posC]=B[posB];
                posB++;
                posC++;
            }

    }

    // IF ANYTHING LEFT!
    if(posA==N && posB<M){
        for(int i=posC;i<Total;i++){
            C[i]=B[posB];
            posB++;
        }
    }
    if(posB==M && posA<N){
        for(int i=posC;i<Total;i++){
            C[i]=A[posA];
            posA++;
        }
    }
    // DONE!

1 个答案:

答案 0 :(得分:0)

您应该设置q = first + (last - first)/2;

此外,您初始化last = S.length您应将其初始化为last = S.length - 1

您可以在The Vogella Tutorials

中找到一个非常好的实现