Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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代码中CRLS合并排序边界代码的理解 void合并(inta[],intp,intq,intr){ int*tmpL,*tmpR; 内边界; int n1,n2; int i,j,k; n1=q-p+1; n2=r-q; tmpL=(int*)malloc(sizeof(int)*(n1+1)); tmpR=(int*)malloc(sizeof(int)*(n2+1)); 对于(i=0;iB为真,则计算C,否则计算D。 但我仍然不理解边界部分。 这是否等同于添加两个while循环来处理其中一半有剩余元素并将它们附加到新数组的末尾_C_Sorting_Mergesort - Fatal编程技术网

C代码中CRLS合并排序边界代码的理解 void合并(inta[],intp,intq,intr){ int*tmpL,*tmpR; 内边界; int n1,n2; int i,j,k; n1=q-p+1; n2=r-q; tmpL=(int*)malloc(sizeof(int)*(n1+1)); tmpR=(int*)malloc(sizeof(int)*(n2+1)); 对于(i=0;iB为真,则计算C,否则计算D。 但我仍然不理解边界部分。 这是否等同于添加两个while循环来处理其中一半有剩余元素并将它们附加到新数组的末尾

C代码中CRLS合并排序边界代码的理解 void合并(inta[],intp,intq,intr){ int*tmpL,*tmpR; 内边界; int n1,n2; int i,j,k; n1=q-p+1; n2=r-q; tmpL=(int*)malloc(sizeof(int)*(n1+1)); tmpR=(int*)malloc(sizeof(int)*(n2+1)); 对于(i=0;iB为真,则计算C,否则计算D。 但我仍然不理解边界部分。 这是否等同于添加两个while循环来处理其中一半有剩余元素并将它们附加到新数组的末尾,c,sorting,mergesort,C,Sorting,Mergesort,如果我不将它们初始化为无限边界,它们可能会给我一个分段错误。merge()应该合并a中已排序的两个运行,从a[p]到a[q],从a[q+1]到a[r](包括在内).TmpL和TmpR被创建,每个元素的末尾都有一个额外元素的空间,用作大于TmpL或TmpR中任何值的哨兵值。三元语句将边界设置为TmpL和TmpR中最后一个值中的较大值,然后将1添加到此值以创建存储在TmpL和TmpR末尾的哨兵值。This消除了检查索引“i”或“j”以查看是否已到达TmpL或TmpR的末尾的需要,在这种情况下,Tmp

如果我不将它们初始化为无限边界,它们可能会给我一个分段错误。

merge()应该合并a中已排序的两个运行,从a[p]到a[q],从a[q+1]到a[r](包括在内).TmpL和TmpR被创建,每个元素的末尾都有一个额外元素的空间,用作大于TmpL或TmpR中任何值的哨兵值。三元语句将边界设置为TmpL和TmpR中最后一个值中的较大值,然后将1添加到此值以创建存储在TmpL和TmpR末尾的哨兵值。This消除了检查索引“i”或“j”以查看是否已到达TmpL或TmpR的末尾的需要,在这种情况下,TmpR或TmpL的其余部分将被复制回[]

对于大多数编程语言,不是使用三元语句,而是代码可以将边界设置为Itmax或从包含文件限制H(或C++,Currimes)中的其他最大值之一:

如果排序浮动或加倍,边界可以设置为无穷大

分段故障的原因是,如果没有sentinel值,代码可能会超出导致故障的TmpL或TmpR的末尾

此排序方法的一个问题是[]可能已经包含最大可能值,在这种情况下,此方法将失败。对于整数,将最大值加1将返回最小值。

merge()应该合并A中已排序的两个运行,从[p]到[q],从[q+1]到[r](含).TmpL和TmpR被创建,每个元素的末尾都有一个额外元素的空间,用作大于TmpL或TmpR中任何值的哨兵值。三元语句将边界设置为TmpL和TmpR中最后一个值中的较大值,然后将1添加到此值以创建存储在TmpL和TmpR末尾的哨兵值。This消除了检查索引“i”或“j”以查看是否已到达TmpL或TmpR的末尾的需要,在这种情况下,TmpR或TmpL的其余部分将被复制回[]

对于大多数编程语言,不是使用三元语句,而是代码可以将边界设置为Itmax或从包含文件限制H(或C++,Currimes)中的其他最大值之一:

如果排序浮动或加倍,边界可以设置为无穷大

分段故障的原因是,如果没有sentinel值,代码可能会超出导致故障的TmpL或TmpR的末尾


这种排序方法的一个问题是,[]可能已经包含可能的最大值,在这种情况下,此方法将失败。对于整数,将最大值加1将换回最小值。

代码使用一种常见的方法进行合并排序,其中复制的两个子数组末尾都有一个额外的元素,设置为大于n两个数组的最大值

语句
boundary=tmpL[n1-1]>tmpR[n2-1]?tmpL[n1-1]+1:tmpR[n2-1]+1;
试图将值
boundary
计算为1加上
tmpL
tmpR
的最大值,具体取决于哪个值更大。它使用了一个三元表达式,大致相当于写入:

    if (tmpL[n1 - 1] > tmpR[n2 - 1])
        boundary = tmpL[n1 - 1] + 1;
    else
        boundary = tmpR[n2 - 1] + 1;

然后,合并循环可以使用单个测试
k=n2 | | tmpL[i]该代码对
mergesort
使用一种通用方法,其中拷贝由两个子数组组成,末尾有一个额外的元素,设置为大于两个数组最大值的值

语句
boundary=tmpL[n1-1]>tmpR[n2-1]?tmpL[n1-1]+1:tmpR[n2-1]+1;
试图将值
boundary
计算为1加上
tmpL
tmpR
的最大值,具体取决于哪个值更大。它使用了一个三元表达式,大致相当于写入:

    if (tmpL[n1 - 1] > tmpR[n2 - 1])
        boundary = tmpL[n1 - 1] + 1;
    else
        boundary = tmpR[n2 - 1] + 1;

然后,合并循环可以使用单个测试
k=n2 | | tmpL[i]通过使用!、括号[image name]和引号(url\image.png)修复图像视图标记。请在问题中包含图像中的所有代码。如果没有其他代码的上下文,阅读本文的其他人可能不清楚该问题。此外,在代码末尾,添加一行显示如何调用mergesort,例如mergesort(a,0,size-1)。我编辑了标记以包含排序并删除“boundary”这在Stack Overflow中通常具有不同的含义。好的,好的,谢谢,我将在我有15个声誉后^^使用!括号[image name]和引号(url\image.png)修复您的图像视图标记。请在问题中包含图像中的所有代码。如果没有其他代码的上下文,阅读本文的其他人可能不清楚该问题。此外,在代码末尾,添加一行显示如何调用mergesort,例如mergesort(a,0,size-1)。我编辑了标记以包含排序并删除“boundary”这在堆栈溢出中通常有不同的含义。好的,好的,谢谢,我将在我有15个声誉后^^^^谢谢^^ ^将1添加到最大值将环绕到