C 合并排序程序 #包括 #包括 无效合并(整数a[],整数l,整数m,整数r) { int i,j,k; int n1=m-l+1; int n2=r-m; int L[n1],R[n2]; 对于(i=0;i

C 合并排序程序 #包括 #包括 无效合并(整数a[],整数l,整数m,整数r) { int i,j,k; int n1=m-l+1; int n2=r-m; int L[n1],R[n2]; 对于(i=0;i,c,C,当您调用mergesort(a,3,5)时,会发生以下情况: #include<stdio.h> #include<stdlib.h> void merge(int a[],int l,int m,int r) { int i,j,k; int n1= m - l + 1; int n2= r - m; int L[n1],R[n2]; for(i=0;i<n1;i++) L[i]=a[l+i]; f

当您调用
mergesort(a,3,5)
时,会发生以下情况:

#include<stdio.h>
#include<stdlib.h>

void merge(int a[],int l,int m,int r)
{
    int i,j,k;
    int n1= m - l + 1;
    int n2= r - m;
    int L[n1],R[n2];
    for(i=0;i<n1;i++)
        L[i]=a[l+i];
    for(j=0;j<n2;j++)
        R[j]=a[m + 1+ j];
    i=0;j=0;k=l;
    while(i<n1 && j<n2)
    {
        if(L[i]<R[j])
        {
            a[k]=L[i];
            i++;
        }
        else
        {
            a[k]=R[j];
            j++;
        }
        k++;
    }
    while(i<n1)
    {
        a[k]=L[i];
        i++;
        k++;
    }
    while(j<n2)
    {
        a[k]=R[j];
        j++;
        k++;
    }
}

void mergeSort(int a[],int l,int r)
{
    if(l<r)
    {
        int m = l+(r-1)/2;
        mergeSort(a,l,m);
        mergeSort(a,m+1,r);
        merge(a,l,m,r);
    }   
}

void printArray(int a[],int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d   ",a[i]);
    printf("\n");
}

int main()
{
    int a[]= {
                12,76,34,45,63,98
             };
    int n = sizeof(a)/sizeof(a[0]);
    printf("The element entered in array   ");
    printArray(a,n);
    mergeSort(a,0,n-1);
    printf("The element after sorting    ");
    printArray(a,n);
    return 0;
}
换句话说:一个无止境的循环

也许你想要这个:

int m = l+(r-1)/2;  // 3 + (5-1)/2 -> 3 + 4/2 -> 3 + 2 -> 5
mergeSort(a,l,m);   // So this will call: mergesort(a, 3, 5) again
那么我是如何发现这个bug的呢

非常简单-只需使用一些printf调试

首先,我在
mergesort
的开头添加了一个打印-如:

int m = (l+(r-1))/2;

        ^       ^
         notice
这告诉我输入值3和5有一个无止境的循环

然后我添加了
m

mergesort 3 5
mergesort 3 5
mergesort 3 5
...
...
很明显,
m
计算错误

仔细看

mergesort 3 5
m 5
mergesort 3 5
m 5
mergesort 3 5
m 5
很明显,加法应该在除法之前。缺少一组
(..)


希望您可以将此调试示例用于自己的调试。

“如果有人可以解释,为什么会给出运行时错误?此程序中没有错误”-你自相矛盾!那么什么是错误或无错误?那么,我们不是调试服务。在你出现错误时,使用调试器跟踪特定的位置。观察变量,然后自己尝试。@Olaf-同意自相矛盾的部分。但是,问“为什么这段代码不起作用”是完全可以的问题。它只要求问题包括复制错误的完整代码库。这个问题是这样做的。对于so来说,这是一个确定的问题。@4386427:它们不确定。请按照链接并查看简历页!非常清楚:“问题寻求调试帮助”(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整且可验证的示例。“@Olaf From the close reason:
提问寻求调试帮助(“为什么这个代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者来说是没有用处的
。这告诉我这样的问题是可以的。但是,对于这个特定的问题,可以认为“问题陈述”“不太清楚。@4386427规则更改将在meta上讨论,而不是对问题的评论!@ShiveshChandra-很乐意帮助:-)请注意调试技术-也许这可以帮助您继续。:-)
void mergeSort(int a[],int l,int r)
{
  printf("mergesort %d %d\n", l, r);
    if(l<r)
    {
        int m = (l+(r-1))/2;
        printf("m %d\n", m);
        mergeSort(a,l,m);
        mergeSort(a,m+1,r);
        merge(a,l,m,r);
    }   
}
mergesort 3 5
m 5
mergesort 3 5
m 5
mergesort 3 5
m 5
int m = l+(r-1)/2;