C语言 这个归并排序有什么问题?


#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 elementsn");
    scanf("%d",&n);
    printf("Enter the elementsn");
    for ( i = 0; i < n; i++ )
    {
        scanf("%d",&a[i]);
    }
    mergesort(a,0,n-1);
    printf("The sorted elements aren");
    for ( i = 0; i < n; i++ )
    {
        printf("%dn",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语言实现了这个归并排序,但是它有一些问题。当我输入123456时,输出结果是321654。看来我错过了一些循环。当我输入54321时,输出显示为21543。有什么问题,我不明白。请帮助。

最后一条语句应该是a[z] = temp[z];而不是output[z] = temp[z];,并打印a数组。在合并排序中,以前的合并结果被使用,所以如果你复制到新的数组,没有正确的合并完成。

您的数组太多了:删除output并将临时数组temp的内容直接写回a,以便每次调用merge都可以看到更深层次递归所做的更改

首先我建议你修改

mergesort(a,0,mid);

mergesort(a,low,mid);

取代

output[z] = temp[z];

a[z] = temp[z];

最新更新