如何调试合并排序?

时间:2018-06-17 16:01:36

标签: c recursion

我知道合并排序是什么,我以前执行过它。但是,当我尝试这样做时,我几乎从未得到理想的答案。 我可以猜到最好,我无法存储最终排序的数组。 你能帮我调试一下吗?解释一下调试任何类似递归问题的方法是什么?

 #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 个答案:

答案 0 :(得分:0)

我的整体评论是&#34;整洁计数&#34;你的merge()代码很乱。你没有看到你从ar2中取出东西但从未放入任何东西吗?此外,arr2不是必需的,所以要摆脱它。你的索引都错了。

你的缩进毫无价值,你期望如何调试? (除了让SO上的人为你做这件事。)想想每一行:它是否建立在之前的陈述之上;是否建立了以下声明?想想每个指数:它从哪里开始;它应该在哪里结束?你的代码解开了:

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