Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-Merge排序示例中的分治范式和递归_C_Sorting_Recursion_Merge_Divide - Fatal编程技术网

C-Merge排序示例中的分治范式和递归

C-Merge排序示例中的分治范式和递归,c,sorting,recursion,merge,divide,C,Sorting,Recursion,Merge,Divide,我不明白C语言是如何实现分治算法的。 我的意思是,我理解这个算法,但不理解用C编写时它为什么工作以及如何工作 在下面的示例中,执行的指令是什么?是什么决定了它们的执行顺序 换句话说,为什么“合并排序初始化”、“合并排序第一”、“合并排序第二”和“合并”会以这种方式出现 #include<stdio.h> int arr[8]={1, 2, 3, 4, 5, 6, 7, 8}; int main() { int i; merge_sort(arr, 0, 7);

我不明白C语言是如何实现分治算法的。 我的意思是,我理解这个算法,但不理解用C编写时它为什么工作以及如何工作

在下面的示例中,执行的指令是什么?是什么决定了它们的执行顺序

换句话说,为什么“合并排序初始化”、“合并排序第一”、“合并排序第二”和“合并”会以这种方式出现

#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;
}
#包括
int-arr[8]={1,2,3,4,5,6,7,8};
int main()
{
int i;
合并排序(arr,0,7);
printf(“排序数组:”);
对于(i=0;i<8;i++)
printf(“%d”,arr[i]);
返回0;
}
整数合并_排序(整数arr[],整数低,整数高)
{
printf(“\n合并排序初始化\n”);
int mid;
如果(低<高)
{
中等=(低+高)/2;
//分而治之
合并排序(arr、低、中);
printf(“\n merge\u sort first\n”);
合并排序(arr、中+1、高);
printf(“\n merge\u sort second\n”);
//结合
合并(arr、低、中、高);
printf(“\n合并\n”);
}
返回0;
}
整数合并(整数arr[],整数l,整数m,整数h)
{
int-arr1[10],arr2[10];
int n1,n2,i,j,k;
n1=m-l+1;
n2=h-m;
对于(i=0;i对于(k=l;k我不知道你为什么要求人们让你理解算法。我可以帮助你,但你必须通过它

简而言之,你必须将数组分成两部分。假设你有10个元素,然后
high=0
low=10-1=1
mid=(9+0)/2=4
。因此,你将主数组分成两部分,从第1个元素到第5个,从第6个元素到第10个(1..10)。当一个片段中有多个元素时,您会将其再次切割为两个。最后,将它们合并,即再次添加数组,但按升序排列。最后,您会对单个数组进行排序。很难解释每个片段。我想来自wiki的此链接会有所帮助


现在是函数调用。主要函数是调用
merge\u sort
它将传递low和high(数组的整个范围),但是在这个函数中,
merge\u sort
将在前半个范围内自己调用两次(从中间开始,在中间之后到最后一个元素)。每次调用都将再次执行相同的操作(将数组分成两部分,分别调用前一半和发送一半)。此过程将继续。
merge
函数将按排序方式添加数组。这就是您所需要的。如果您不清楚,请打印或调试参数值。

首先缩进代码,使其不清晰。@James learn@Nobilis感谢您的编辑。@JamesDean,然后用纸和笔查看一个小示例,并观察其中的内容命令你提示指纹。递归是一件你只有通过它才能理解的事情。我认为这里的任何人都不能帮你。我在Robert Sedgewick和Kevin Wayne的算法中找到了我问题的答案,第四版,第272-273页。