所以我编写了一个用于合并排序的C代码,它适用于3个元素的数组,但是当我增加元素数量时它会给出垃圾值。因为,这是一个递归代码,不应该出现这种类型的问题。我究竟做错了什么?这给出了类似的输出:2,5,1881172767,32718,我不明白这些垃圾值的来源。
#include<stdio.h>
void merge(int *a,int s,int m,int e)
{
int l1,l2;
int c[50];
l1=m-s+1;
l2=e-m;
int i=0,i1=0,i2=0;
while(i1<l1 && i2<l2)
{
if(a[i1]<a[i2+m+1])
{
c[i]=a[i1];
i1++;
}
else
{
c[i]=a[i2+m+1];
i2++;
}
i++;
}
while(i1<l1)
{
c[i]=a[i1];
i1++;
i++;
}
while(i2<l2)
{
c[i]=a[i2+m+1];
i2++;
i++;
}
for(i=0;i<=e;i++)
{
a[i]=c[i];
}
}
void mergesort(int *a,int s,int e)
{
int m;
if(s<e)
{
m=(s+e)/2;
mergesort(a,s,m);
mergesort(a,m+1,e);
merge(a,s,m,e);
}
}
void main()
{
int i;
int a[4]={3,2,1,5};
mergesort(a,0,3);
for(i=0;i<4;i++)
printf("%d,",a[i]);
}
答案 0 :(得分:1)
在a或c中寻址元素时,您忘记添加s的偏移量。只要s == 0,就没有问题。但是当你的数组变大时,你只将元素复制到数组的第一部分,最后的元素保持未初始化。
您的代码
if(a[i1]<a[i2+m+1])
{
c[i]=a[i1];
i1++;
}
v.gr应该是
if(a[i1+s]<a[i2+m+1])
{
c[i+s]=a[i1+s];
i1++;
}
在您的代码中进一步纠正此问题。
通常,对于那种操作,C更喜欢使用指针。