0
#include<stdio.h>
#include<conio.h>
//#include<alloc.h>

int* mergeSort(int*,int);
int* merge(int*,int*,int);

void main()
{
  int n;int i=0;
  int *a,*b;

  scanf("%d",&n);
  a=(int)malloc(n*sizeof(int));
  for(;i<n;i++)
     scanf("%d",&a[i]);

  b=mergeSort(a,n);
  for(i=0;i<n;i++)
     printf("%d ",b[i]);

}

int* mergeSort(int *b,int n)
{
  int temp,*s;

  if(n>2)
  {
     mergeSort(b,n/2);
     mergeSort(b+n/2,n-n/2);
     s=merge(b,b+n/2,n);

     return s;
  }
  else if(n==2)
  {
     if(b[0]>b[1])
     {
         temp=b[0];
         b[0]=b[1];
         b[1]=temp; 
     }
     return;
  }
}

int* merge(int* a,int* c,int n)
{
  int i=0,j=0,k=0,
  int* x;

  while( (j ! =n/2) && (k != (n-n/2)) && (i < n))
  {
       if(a[j]<c[k])
       {
             x[i]=a[j];
             j++; 
             i++;
       }
       else
       {
             x[i]=c[k];
             k++;
             i++;
       }
   }
   for( ; j<n/2; j++,i++)
      x[i]=a[j];

   for( ; k < (n-n/2); k++,i++)
      x[i]=c[k];

   return x;
}

当我运行此代码时,它在第一个 for 循环中输入数组的所有元素后挂起。请帮助我,我该如何纠正它以使其成功运行?它挂起从 main() 函数调用 mergeSort 函数。

4

3 回答 3

3

it hangs after inputting all the elements of the array in first for loop.

挂起?你确定......考虑到你的合并代码声明了一个指向 int 的指针,这很好:

int *x;

并且从不初始化它,然后尝试跳转到i过去的偏移量():

x[i]=a[j];

将您的代码更改为:

int *x = malloc(n * sizeof(int));

它应该停止崩溃/挂起。

仅供参考,只要你现在malloc()应该free()有内存泄漏。

于 2013-02-06T14:50:41.017 回答
0

有一些事情是错误的,不仅是基本的事情,比如void main代替,int main而且还有例如应该返回return;的和未初始化的。该算法还有一件重要的事情:您似乎假设它是 2 的幂:您递归地除以 2 并假设它始终是未截断的整数。mergeSort()int*xn

于 2013-02-06T14:58:49.497 回答
0

对于初学者,代码不能在 C++ 编译器中编译(我知道它是 C 代码,但仍然......),

几个问题是:

第 11 行:

a=(int)malloc(n*sizeof(int));

你为什么要投射一个指向 int 的指针?a 是一个整数 *

第 38 行:

return;

你从没有返回值的mergeSort返回......这不好

我建议您修复所有编译器错误和警告,然后重试

于 2013-02-06T15:01:30.697 回答