这种合并排序有什么问题?

时间:2014-06-16 09:12:22

标签: c mergesort

#include <stdio.h>
int output[50];

void mergesort (int a[], int low, int high);
void merge ( int a[], int l, int m, int h );

int main(void)
{

    int n,a[50],i;
    printf("Enter total elements\n");
    scanf("%d",&n);

    printf("Enter the elements\n");
    for ( i = 0; i < n; i++ )
    {
        scanf("%d",&a[i]);
    }

    mergesort(a,0,n-1);
    printf("The sorted elements are\n");
    for ( i = 0; i < n; i++ )
    {
        printf("%d\n",output[i]);
    }

    return 0;
}

void mergesort (int a[], int low, int high)
{

    int mid;
    if ( low < high )
    {
        mid = (low+high)/2;
        mergesort(a,0,mid);
        mergesort(a,mid+1,high);
        merge(a,low,mid,high);
    }

}

void merge ( int a[], int l, int m, int h )
{
    int i = l,j = m+1;
    int temp[50],z,t=l;

    while ( (i <= m) && (j <= h) )
    {

        if (a[i] <= a[j])
        {
            temp[t] = a[i];
            t++;
            i++;
        }

        else
        {
            temp[t] = a[j];
            t++;
            j++;
        }

    }

    while ( i <= m )
    {
        temp[t] = a[i];
        i++;
        t++;
    }

    while ( j <= h )
    {
        temp[t] = a[j];
        j++;
        t++;
    }

    for ( z = l; z <= h; z++ )
    {
        output[z] = temp[z];
    }

}

我在C中实现了mergesort的实现。但是,它有一些问题。 当输入为123456时,输出为321654.似乎我错过了一些循环。当我输入54321时,它显示输出为21543.问题是什么,我无法理解。请帮忙。

3 个答案:

答案 0 :(得分:2)

最后一个语句应为a[z] = temp[z];而不是output[z] = temp[z];并打印a数组。在合并排序中,使用先前的合并结果,因此如果复制到新数组,则不会进行适当的合并。

答案 1 :(得分:0)

你有一个数组太多:删除output并将临时数组temp的内容直接写回a,以便每次调用merge可以看到更深层递归所带来的变化。

答案 2 :(得分:0)

首先我建议你改变

mergesort(a,0,mid);

mergesort(a,low,mid);

然后替换

output[z] = temp[z];

a[z] = temp[z];