#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.问题是什么,我无法理解。请帮忙。
答案 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];