合并C中的排序代码无法正常工作

时间:2017-11-12 09:13:42

标签: c sorting mergesort

所以我编写了一个用于合并排序的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]);
 }

1 个答案:

答案 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更喜欢使用指针。