所以我编写了一个用于合并排序的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]);
}
最佳答案
在对 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 更喜欢使用指针。
关于c - C 中的合并排序代码无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47247150/