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

标签 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]);
 }

最佳答案

在对 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/

相关文章:

c - 是否可以将事件文件描述符与中断驱动输入结合使用?

c - C语言中声明void**是什么意思?

arrays - Perl:强制按数字顺序散列

javascript - 如何翻转 div 标签中项目的排序顺序?

c++ - 动态数组未正确初始化

c++ - 将元素分配给数组不起作用(使用 OpenMP 的并行合并排序)

你能在指向数组的指针中打印内容吗?

C Hangman 程序调试辅助(中止陷阱 :6 error)

c - 找到 4 个整数的最大值或最小值的最快方法?

c - 检测到堆损坏 - 使用字符串实现合并排序