MergeSort - 编译但不提供任何输出

时间:2011-11-02 01:18:57

标签: c mergesort

这是基于Cormen书中给出的算法。我做错了什么?

#include <stdio.h>
#include <conio.h>

void mergesort(int a[],int,int);
void merge(int a[],int,int,int);

int main()
{
   int i,num,a[50];

   printf("Enter the number of elements : ");
   scanf("%d",&num);

   for(i=1;i<=num;i++)
   {
      printf("\n%d) ",i);
      scanf("%d",&a[i]);
   }

   mergesort(a,1,num);

   for(i=1;i<=num;i++)
   {
      printf("SoRTED ArrAy \n");
      printf("\n%d) ",a[i]);
   }

   getch();

   return 0;
}

void mergesort(int a[],int i, int k)
{
   int j;
   j=(i+k)/2;

   while(i<k)
   {
      mergesort(a,i,j);
      mergesort(a,j+1,k);
      merge(a,i,j,k);
   }
}

void merge(int a[],int p,int q,int r)
{
   int i,j,k,n1,n2;

   n1=q-p+1;
   n2=r-q;

   int l[n1],s[n2];

   for(i=1;i<=n1;i++)
   {
      l[i]=a[p+i-1];
   }

   for(j=1;i<=n2;j++)
   {
      s[j]=a[q+j];
   }

   l[n1+1]=1000;
   s[n2+1]=1000;

   i=1;
   j=1;

   for(k=p;k<=r;k++)
   {
      if(l[k]<s[k])
      {
         a[k]=l[i];
         i++;
      }
      else
      {
         a[k]=s[j];
         j++;
      }
   }
}

2 个答案:

答案 0 :(得分:3)

主要问题是ik永远不会在mergesort函数的while循环中更新,从而导致无限循环。你可能甚至不需要while循环。

答案 1 :(得分:0)

void mergesort(int a[],int i, int k)
{
 int j;
 j=(i+k)/2;
 while(i<k)
 {
  mergesort(a,i,j);
  mergesort(a,j+1,k);
  merge(a,i,j,k);
 }
}

while内的任何内容都不会更改ik的值。因此,如果i<k,循环将永远重复。