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;や初期化されていないものなど、いくつかの問題があります。また、アルゴリズムに関する1つの重要な点は、2の累乗であると想定しているようです。再帰的に2で除算し、常に切り捨てられていない整数であると想定します。mergeSort()int*xn

于 2013-02-06T14:58:49.497 に答える
0

まず、コードは C++ コンパイラではコンパイルされません (C コードであることはわかっていますが、それでも...)。

いくつかの問題は次のとおりです。

11行目:

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

なぜポインタを int にキャストするのですか? a は int です *

38行目:

return;

あなたは戻り値なしでmergeSortから戻っています...それは良いことではありません

すべてのコンパイラ エラーと警告を修正してから、もう一度やり直すことをお勧めします。

于 2013-02-06T15:01:30.697 に答える