在C - Merge排序示例中划分和征服范式和递归

时间:2013-07-04 07:08:07

标签: c sorting recursion merge divide

我无法理解如何在C中实现分而治之的算法。 我的意思是我理解算法但不理解为什么以及如何用C语言编写它。

在以下示例中,执行的指令是什么以及它们的执行顺序是什么?

换句话说,为什么“merge_sort initialization”,“merge_sort first”,“merge_sort second”和“merge”会以他们的方式出现?

#include<stdio.h>

int arr[8]={1, 2, 3, 4, 5, 6, 7, 8};

int main()
{
    int i;
    merge_sort(arr, 0, 7);

    printf("Sorted array:");

    for(i = 0; i < 8; i++)
        printf("%d", arr[i]);

    return 0;
}

int merge_sort(int arr[],int low,int high)
{
    printf("\nmerge_sort initialization\n");

    int mid;

    if(low < high) 
    {
        mid = (low + high) / 2;

        // Divide and Conquer
        merge_sort(arr, low, mid); 
        printf("\n merge_sort first\n");

        merge_sort(arr, mid + 1, high); 
        printf("\n merge_sort second\n");

        // Combine
        merge(arr, low, mid, high); 
        printf("\nmerging\n");
    }

    return 0;
}

int merge(int arr[], int l, int m, int h)
{
    int arr1[10], arr2[10];
    int n1, n2, i, j, k;
    n1 = m - l + 1;
    n2 = h - m;

    for(i = 0; i < n1; i++)
        arr1[i] = arr[l + i];

    for(j = 0; j < n2; j++)
        arr2[j] = arr[m + j + 1];

    arr1[i] = 9999;
    arr2[j] = 9999;

    i = 0;
    j = 0;

    for(k = l; k <= h; k++)
    {
        if(arr1[i] <= arr2[j])
            arr[k] = arr1[i++];
        else
            arr[k] = arr2[j++];
    }

    return 0;
}

提前感谢您的回答。

1 个答案:

答案 0 :(得分:2)

我不确定你为什么要求别人让你理解算法。我可以帮助你,但你必须经历它。

在合并时,您必须将阵列分成两部分。假设您有10个元素,然后是high=0low=10-1=1mid = (9+0)/2 = 4。因此,您已将主阵列从第1个元素划分为2个部分到第5个元素,从第6个元素划分为第10个元素(1..10)。当你在一件作品中有多个元素时,你又将它切成两个。最后合并它们,即再次添加数组,但是按升序排列。最后你得到一个单独的数组排序。很难解释每一件作品。我认为来自wiki的这个链接可以提供帮助。 http://en.wikipedia.org/wiki/Merge_sort

现在调用函数。 main函数调用merge_sort它将传递低和高(数组的整个范围)但在此函数内merge_sort将自己调用两次上半场范围(从中途开始到中途之后)最后一个元素)。每个调用将再次执行相同的操作(将数组分开并调用前半部分并发送一半)。这个过程将继续下去。 merge函数将以排序的方式添加数组。多数民众赞成你需要的。如果您不清楚打印或调试参数值。