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

合并排序:需要从临时数组复制元素

濮阳安澜
2023-03-14

我一直在试着分析mergesort,但我被一个奇怪的错误击中了。这是我的代码

int merge(int *a,int st,int mid,int en)
{
    int i,j,l,m;
    i = st;
    l = st;
    m = mid + 1;
    while((l<=mid) && (m <= en))
    {
        if(a[l] <= a[m])
        {
            temp[i] = a[l];
            l++;
            i++;
        }
        else
        {
            temp[i] = a[m];
            m++;
            i++;
        }
    }
    if(l <= mid)
    {
        for(j=l;j<=mid;j++)
        {
            temp[i] = a[j];
            i++;
        }
    }
    else 
    {
        for(j=m;j<=en;j++)
        {
            temp[i] = a[j];
            i++;
        }
    }
    for(j=st;j<=en;j++) // ??
        a[j] = temp[j];  // ??
}

void mergesort(int *a,int st,int en)
{
    int mid;
    if(st<en)
    {
        mid = (st+en)/2;
        mergesort(a,st,mid);
        mergesort(a,mid+1,en);
        merge(a,st,mid,en);
    }
}

int main()
{
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    mergesort(a,0,n-1);
    for(i=0;i<n;i++)
        printf("%d\n",temp[i]);
    getch();
    return 0;
}

我一直在使用典型的合并排序代码。我在理解为什么需要将内容从临时数组复制到主数组以获得正确的输出时遇到了问题。我尝试了以下输入:5(术语数量),
4 2

我得到的输出为:3 2 4 4 5,而没有将内容从临时数组复制到主数组,如果我使用“注释”循环进行复制,输出很好,即2 3 4 4 5。我只是不明白,为什么会这样?

共有1个答案

关项明
2023-03-14

复制是必要的,因为复制是在合并函数中完成的,而不是在合并函数中完成的。合并函数必须递归地一次又一次调用;所以临时数组会继续变化。

在每次mergesort调用中,需要将原始数组中部分排序的部分放入原始数组中。部分排序的部分实际上是临时数组。

 类似资料:
  • 我试图从黑莓的本机日历中读取“day”值,该值以整数形式返回,并映射到一周中每一天的值。这些值如下所示: 周一:32768 星期二:16384 周三:8192 周四:4096 周五:2048 sat:1024 孙:65536 如果事件发生在一天内,我可以看到值是否为mon/tue/we/thu/fri/sat/sun 值也与星期一值相同。 现在的问题是,如果事件发生在两天或三天以上 返回所选天数的

  • 我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。 你能告诉我怎么做吗? 编辑:我编写了以下算法: 你能告诉我这是否正确吗?

  • 我在Java中实现合并排序算法时遇到了一个问题:我做过合并排序算法,但它不能产生正确的结果。我还从函数中返回排序列表。我怎么也能做到这一点? 下面是我定义的合并排序算法。 合并排序方法: MergeSort函数: 合并算法: 实现比较器功能 我该怎么做?

  • 我试图实现一个非常简单的合并排序版本(不考虑为此目的进行的所有优化),我的目标是返回合并数组的新副本,而不是通过引用传递输入数组并将合并元素复制到其中的传统方法。 为此,我的代码如下: > 我知道来自合并的这个数组是一个本地数组,因此我将它返回给mergesort,而mergesort又将它返回给main。假设这不会从后续的递归调用中传入和传出,我是否错了? 我对这段代码的测试输入是{1,0,9}

  • 问题是关于从16:43到23:34的视频中的合并排序http://youtu.be/M814OagXWTI?t=16m43s 在退出左/右排序合并递归后,我不清楚我们是如何合并回这些子数组的。让我们从最底部开始,当我们的元素被分成两个子数组时,一个左子数组称为B,一个右子数组称为C。在16:43左右,我们跳转到合并函数,对数组B和C进行排序,这两个数组只有8和3。合并排序函数(下面的代码)基本上通

  • 问题内容: 如果binarySearch方法要求您先对数组进行排序,然后再将其作为参数传递给方法调用,那么为什么不对binarySearch方法进行排序呢? 问题答案: 二进制搜索的工作原理是假设数组的中间包含数组中的中值。如果未排序,则此假设就没有意义,因为中位数可以在任何地方,并且将数组减半可能意味着您削减了要搜索的数字。 二进制搜索不进行排序本身的原因是因为它不需要…该数组已排序。