【问题标题】:My MergeSort not reading right side我的 MergeSort 没有读取右侧
【发布时间】:2014-03-20 15:21:27
【问题描述】:

我的 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!

【问题讨论】:

  • 所有代码请使用Java naming conventions。方法应该在camelCase。不遵守这些约定会使我们更难阅读您的代码(并且还会弄乱语法突出显示)。
  • 您的预期输出是什么?因为我刚刚运行了带有输出的示例,并且它肯定在方法中运行了第二个MergeSort()
  • 我给它一个数组,例如 (3,2,5,6,1),它将 3 与 0 进行比较。然后将 3,2 与 0 进行比较。第二部分 (5,6, 1)一切都是0。它将0与0进行比较,然后将0与0进行比较...已编辑!最后输出 0,0,1,5,6 所以一部分没了。
  • 也许我对这个问题的回答 (stackoverflow.com/questions/21771119/…) 可以帮助您调试代码

标签: java sorting recursion mergesort


【解决方案1】:

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

另外,你初始化last = S.length 你应该把它初始化为last = S.length - 1

你可以在The Vogella Tutorials找到一个很好的实现

【讨论】:

  • 那肯定不行吗? first == 0,所以从 p 中删除它仍然不会解决他们的问题。递归仍将是一个无限循环。
  • 试过了。没有帮助。问题仍然存在。
  • @RudiKershaw if 语句不是循环。只要first 小于last,它就会被输入。输入时,它将递归调用该函数。最终first 将等于last,并且if 语句将不会有效地终止该初始调用的递归。
  • @BrianVanover 对。我看到的所有 MergeSort 都是一样的。我的 MergeSort 有 3 个变量和 Merge 5。所以它的完成方式有点不同。
  • @STUDENT_LIFE 尝试我刚刚提供的第二次更正。
猜你喜欢
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2018-07-28
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多