帮我看下归并排序的问题
void Merge(int A[],int p,int q,int r)
{
int L[10],R[10],i;
for(i=p;i<=q;i++)
{
L[i-p]=A[i];
}
for(i=q+1;i<=r;i++)
{
R[i-q-1]=A[i];
}
i=0;
int a=0,b=0;
while(a<q-p+1 && b<r-q)
{
if(L[a]<=R[b])
{
A[i]=L[a];
i++;
a++;
}
else
{
A[i]=R[b];
i++;
b++;
}
}
while(a<q-p+1 && i<r-p+1)
{
A[i]=L[a];
i++;
a++;
}
while(b<r-p && i<r-p+1)
{
A[i]=R[b];
b++;
i++;
}
}
void MergeSort(int A[],int p,int r)
{
if(p<r)
{
int q;
q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);
}
}
各位看看用这个做了问题出在哪,我感觉好像可以啊。。。但是运行了之后是不可以的,没反应。 归并排序 C
[解决办法]
第13行,i应该改为p吧,merge对a的[p,q,r]区间进行归并
[解决办法]
void Merge(int A[],int p,int q,int r)
{
int L[10],R[10],i;
for(i=p;i<=q;i++)
{
L[i-p]=A[i];
}
for(i=q+1;i<=r;i++)
{
R[i-q-1]=A[i];
}
i=p; //question 1, 从p开始
int a=0,b=0;
while(a<q-p+1 && b<r-q)
{
if(L[a]<=R[b])
{
A[i]=L[a];
i++;
a++;
}
else
{
A[i]=R[b];
i++;
b++;
}
}
while(a<q-p+1) // q-p+1就够了
{
A[i]=L[a];
i++;
a++;
}
while(b<r-q) // b<r-q, 不是r-p
{
A[i]=R[b];
b++;
i++;
}
}
void MergeSort(int A[],int p,int r)
{
if(p<r)
{
int q;
q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);
}
}