#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];