【问题标题】:Why is this implementation of merge sort not working?为什么这种合并排序的实现不起作用?
【发布时间】:2019-07-31 05:06:30
【问题描述】:

我得到了Here 的帮助,但我特别不想将我的方法声明为无效。任何帮助,将不胜感激!

class merges{
public static void main (String args[]){
    int[] A = {10,9,8,7,6,5,4,3,2,1};

    for(int i =0; i< A.length; i++){
        System.out.print(A[i]+" ");
    }
    System.out.println();

    A = mergesort(A,0,A.length-1);

    for(int i =0; i< A.length; i++){
        System.out.print(A[i]+" ");
    }
    System.out.println();
}

static int[] mergesort(int[]A,int l, int r){
    if(l >= r){
        return A;
    }
    else{
        int mid = (l+r)/2;
        mergesort(A,l,mid);
        mergesort(A,mid+1,r);
        return merge(A,l,r);
    }
}

static int[] merge( int[]A, int l, int r){
    int m = (l+r)/2;
    int[]L = new int[m-l+1];
    int[]R = new int[r-m];

    for(int i=0; i<m-l+1; i++ ){
        L[i] = A[l+i];
    }
    for(int i=0; i<r-m; i++ ){
        R[i] = A[m+i+1];
    }

    int i =0;
    int j =0;
    int []B = new int[A.length];
    int k=0;

    while (i<L.length && j<R.length){
        if(L[i]<R[j]){
            B[k] = L[i];
            i++;
        }
        else{
            B[k] = R[j];
            j++;
        }
        k++;
    }

    while(i<L.length){
        B[k] = L[i];
        k++;
        i++;
    }
    while(j<R.length){
        B[k] = R[j];
        k++;
        j++;
    }
    return B;
}
}

这是我的归并排序的实现,我得到的输出是 5 4 3 2 1 10 9 8 7 6。

谁能帮我弄清楚如何才能完成这项工作?

我不想将 mergesort 和 merge 方法声明为 void,而是希望它们返回排序后的数组。提前致谢。

【问题讨论】:

  • 这里有什么问题?你被困在哪里了?你遇到了什么错误?
  • 问题是输出不是 1 2 3 4 5 6 7 8 9 10,我只卡在这个。没有错误。

标签: java algorithm sorting merge mergesort


【解决方案1】:
int k=l;

while (i<L.length && j<R.length){
    if(L[i]<R[j]){
        A[k] = L[i];
        i++;
    }
    else{
        A[k] = R[j];
        j++;
    }
    k++;
}

while(i<L.length){
    A[k] = L[i];
    k++;
    i++;
}
while(j<R.length){
    A[k] = R[j];
    k++;
    j++;
}
return A;

【讨论】:

  • 成功了!非常感谢!!即使我们不将数组 ref 从 B 更改为 A,它也可以工作。
【解决方案2】:

问题是您的 merge 函数返回一个新数组,但您调用它时就好像您打算修改 A 一样。

您可以通过在 merge 函数末尾将 B 复制到 A 中来解决此问题:

k = 0;
for(int i=l; i<r; i++ ){
    A[i] = B[k++];
}

【讨论】:

  • 具体在哪里?你能详细说明一下吗?
  • 我试着把这个放在 return 语句之前并得到这个输出 1 1 3 4 1 6 6 8 9 6
猜你喜欢
  • 2021-04-23
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2012-11-07
相关资源
最近更新 更多