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

时间:2014-01-06 15:40:24

标签: c mergesort

我一直在尝试分析mergesort,但我对一个奇怪的bug感到震惊。 这是我的代码:

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     4     五     3     2

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

1 个答案:

答案 0 :(得分:0)

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

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