当前位置: 首页 > 知识库问答 >
问题:

为什么合并排序的这个实现不起作用?

汪信鸥
2023-03-14

我从这里得到了帮助,但我特别不想宣布我的方法无效。任何帮助都将不胜感激!

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,而是希望它们返回排序后的数组。提前谢谢。

共有2个答案

杨晓博
2023-03-14

问题是,merge函数返回一个新数组,但调用它时,就好像希望它就地修改a一样。

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

k = 0;
for(int i=l; i<r; i++ ){
    A[i] = B[k++];
}
班凌
2023-03-14
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;
 类似资料:
  • 我第一次用一个辅助数组实现了合并排序,以尝试使用JavaScript实现可视化。这似乎应该是有效的,但它不是。任何帮助或提示将不胜感激。 编辑:我忘了包括它不起作用的情况。它们是: 输入:[4, 2, 5, 6, 7, 7]输出:[4, 2, 5, 6, 7, 7] 输入:[6,6,6,4,6,2]输出:[4,6,6,6,6,2] 输入:[6, 7, 3, 10, 7, 9, 6, 3, 4, 6

  • 问题内容: 嗨,我只是想创建一个简单的golang应用程序,它使用以下命令在identi.ca上发布新的凹痕 到目前为止,这是我的代码,恕我直言,这应该起作用,但实际上它不起作用,有人知道如何解决此问题吗? 编辑: 不:我没有收到任何错误消息:/ 问题答案: 不会将整个命令行作为单个参数。您需要将其称为: 您怎么知道是否遇到错误?您无需检查的返回值。 您实际上应该将命令创建与运行分开。这样,您可以

  • 问题内容: 码: 上面的代码不起作用。当我单击#clicker时,它不会发出警报,也不会隐藏。我检查了控制台,没有任何错误。我还检查了JQuery是否正在加载,实际上是否正在加载。所以不确定是什么问题。我还执行了带有警报的文档就绪功能,并且该功能正常工作,因此不确定我在做什么错。请帮忙。谢谢! 问题答案: 您应该在一个块中添加javascript代码。 即 正如jQuery文档指出的那样:“在文档

  • 我从课本上抄了一个例子,但它拒绝编译。我是不是在什么地方打错了?出于某种原因,在客户端代码中,collections.sort(words)不允许程序编译。任何帮助都很感激。代码复制自Stuart Reges和Marty Stepp的“构建Java程序”第二版。我正试图通过复制来理解它。 该程序应该将一个CalendarDate对象装入一个ArrayList中。通过实现CalendarDate的可

  • 问题内容: 我们知道快速排序是最快的排序算法。 JDK6 使用合并排序算法而不是快速排序。但是Arrays.sort使用快速排序算法。 Collections.sort使用合并排序而不是快速排序的原因是什么? 问题答案: 极有可能从乔希布洛赫§: 我确实写了这些方法,所以我想我有资格回答。确实没有最佳的排序算法。与mergesort相比,QuickSort有两个主要缺陷: 它不稳定(如parsif

  • 我读过这些话: 为了使动态规划适用,一个问题必须具有两个关键属性:最优子结构和重叠子问题。如果一个问题可以通过组合非重叠子问题的最优解来解决,那么这个策略就叫做“分而治之”。这也是为什么mergesort和quicksort没有被归类为动态规划问题的原因。 我有三个问题: 为什么合并排序和快速排序不是动态编程? 我认为合并排序也可以将小问题和小问题分开,然后做同样的事情等等。 Dijkstra算法