首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

帮小弟我看下归并排序的有关问题

2013-07-08 
帮我看下归并排序的问题void Merge(int A[],int p,int q,int r){int L[10],R[10],ifor(ipiqi++){L[i

帮我看下归并排序的问题

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);
        }
}

热点排行