关于递归调用中的计数问题
我在上算法的课程,有个程序让我们实验性计算mergesort的运行时间,要求只计归并部分的数值比较次数.但是因为mergesort部分是递归的,计数器每次都置零了,我写的程序都只能计最后一次归并的数值比较次数.怎么解决这个问题呢。我写的程序如下:请指教!#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
using namespace std;
int ranInt(int m,int n);
void perm(int x[],int n);
int mergesort(int x[],int left,int right);
int merge(int x[],int l,int r);
int main()
{
int x[201];
for(int j=1;j<=10;j++)
{
perm(x,10);
for(int i=1;i<=10;i++)
{
cout<<x[i]<<" ";
}
cout<<endl;
int c=mergesort(x,1,10);
for(int i=1;i<=10;i++)
{
cout<<x[i]<<" ";
}
cout<<endl<<"count="<<c<<endl<<endl;
}
cout<<endl;
cout<<endl<<endl;
for(int n=5;n<=200;n=n+5)
{
int totalcount=0;
for(int j=1;j<=10;j++)
{
perm(x,n);
totalcount=totalcount+mergesort(x,1,n);
}
double Eav=totalcount/10.0;
double scaledEav=Eav/(n*log(n)/log(2));
cout<<endl<<setw(6)<<n<<setw(13)<<Eav<<setw(13)<<scaledEav;
}
cout<<endl<<endl;
cin.get();
cin.get();
return 0;
}
int ranInt(int m,int n)
{
double u=rand()/(RAND_MAX+1.0);
return (int)(m+floor((n-m+1)*u));
}
void perm(int x[],int n)
{
for(int i=1;i<=n;i++)
{
x[i]=i;
}
for(int k=n;k>=2;k--)
{
int j=ranInt(1,k);
int temp=x[k];
x[k]=x[j];
x[j]=temp;
}
}
int mergesort(int x[],int left,int right)
{ int count=0;
if (left<right)
{ int middle=(left+right)/2;
mergesort(x,left,middle);
mergesort(x,middle+1,right);
count=count+merge(x,left,right);
}
return count;
}
int merge(int x[],int l,int r)
{ int M=(l+r)/2;
int count1=0;
int i=l,j=M+1,k=1,temp[201];
while((i<=M)&&(j<=r))
{if (x[i]<=x[j])
{ temp[k]=x[i];
i=i+1;
count1++;
}
else { temp[k]=x[j];
j=j+1;
count1++;
}
k=k+1;
}
if(i>M)
{
for(int p=j;p<=r;p++)
{ temp[k]=x[p];
k=k+1;
}
}
else
{
for(int p=i;p<=M;p++)
{ temp[k]=x[p];
k=k+1;
}
}
int n=r-l+1;
for(int p=1;p<=n;p++)
x[l+p-1]=temp[p];
return count1;
}