代码之家  ›  专栏  ›  技术社区  ›  Shubham

如何调试合并排序?

  •  -3
  • Shubham  · 技术社区  · 6 年前

    我知道什么是合并排序,而且我以前执行过它。但当我尝试这样做的时候,我几乎从来没有得到想要的答案。 据我所知,我在存储最终排序的数组时遇到了问题。 你能帮我调试一下这个并解释一下调试类似递归问题的方法吗?

     #include<stdio.h>
    
    void merge(int arr[],int p,int q,int r)
    {
        int n1= q-p+1;//1st half
        int n2= r-(q+1)+1;//2nd half
        int arr2[100];
        int n=p;
    
        int ar1[n1],ar2[n2];
        for(int i=p;i<=q;i++)
        {
            ar1[i]=arr[p+i];
        }
        for(int i=q+1;i<=r;i++)
        {
            ar1[i]=arr[p+i];
        }
        int i,j;
    
        for(i=0,j=0;i<n1&&j<n2;)
        {
            if(ar2[j]<ar1[i]){arr2[n]=ar2[j];j++;}
    
            else {arr2[n]=ar1[i];i++;}
    
            n++;
    }
    
    while (i<=n1)
    {
        arr[n]=ar1[i];
        n++;
    }
    while (j<=n2)
    {
    
    
        arr[n]=ar2[j];
            n++;
        }
        if(p==0&&r==9)
        {
            for(int i=0;i<=9;i++)
            {
                printf("%d",arr2[i]);
            }
        }
    }
    void mergesort(int arr[], int p, int r)
    {
        if(p<r)
        {
            int q=(p+r)/2;
            mergesort(arr,p,q);
            mergesort(arr,q+1,r);
            merge(arr,p,q,r);
        }   
    }
    
    
    int main()
    {
        int arr[]={2,4,13,4,0,23,54,12,6,9};
        mergesort(arr,0,9);
        for(int i=0;i<=9;i++)
        {
            printf("%d ",arr[i]);
        }
    
        return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   cdlane    6 年前

    我的总体评价是“整洁很重要”,而你 merge() 代码一团糟。你没看到你把东西拿出来吗 ar2 但从来没往里面放东西?也, arr2 不需要,所以把它扔掉。你的索引都错了。

    您的缩进毫无价值,您希望如何调试任何东西?(除了让人们这么做你)想想每一行:它建立在前面的语句之上;它建立在下面的语句之上吗?想想每个索引:它从哪里开始;它应该从哪里结束?你的密码解开了:

    #include <stdio.h>
    
    void merge(int array[], int p, int q, int r)
    {
        int n1 = q - p + 1; // 1st half
        int n2 = r - (q + 1) + 1; // 2nd half
    
        int ar1[n1], ar2[n2];
    
        for (int i = p, j = 0; j < n1; i++, j++)
        {
            ar1[j] = array[i];
        }
    
        for (int i = q + 1, j = 0; j < n2; i++, j++)
        {
            ar2[j] = array[i];
        }
    
        int i = 0, j = 0, n = p;
    
        for (; i < n1 && j < n2; n++)
        {
            if (ar2[j] < ar1[i])
            {
                array[n] = ar2[j++];
            } else {
                array[n] = ar1[i++];
            }
        }
    
        while (i < n1)
        {
            array[n++] = ar1[i++];
        }
    
        while (j < n2)
        {
            array[n++] = ar2[j++];
        }
    }
    
    void mergesort(int array[], int p, int r)
    {
        if (p < r)
        {
            int q = (p + r) / 2;
            mergesort(array, p, q);
            mergesort(array, q + 1, r);
            merge(array, p, q, r);
        }   
    }
    
    int main()
    {
        int array[] = {2, 4, 13, 4, 0, 23, 54, 12, 6, 9};
    
        int length = sizeof(array) / sizeof(int);
    
        mergesort(array, 0, length - 1);
    
        for (int i = 0; i < length; i++)
        {
            printf("%d ", array[i]);
        }
    
        printf("\n");
    
        return 0;
    }