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
Algorithm 合并排序算法的调用机制_Algorithm_Sorting_Recursion_Mergesort - Fatal编程技术网

Algorithm 合并排序算法的调用机制

Algorithm 合并排序算法的调用机制,algorithm,sorting,recursion,mergesort,Algorithm,Sorting,Recursion,Mergesort,调用第一个mergesort函数,直到满足if条件 现在据我所知,如果条件不满足,那么它的身体就不会执行 我无法理解在调用第二个mergesort函数的条件不满足后,它是如何发生的? 请详细解释 mergesort (int*a,int*b,int low,int high) { int pivot if(low<high) { pivot=(low+high)/2; mergesort(a,

调用第一个mergesort函数,直到满足if条件 现在据我所知,如果条件不满足,那么它的身体就不会执行

我无法理解在调用第二个mergesort函数的条件不满足后,它是如何发生的? 请详细解释

mergesort (int*a,int*b,int low,int high)

{

     int  pivot
     if(low<high)
      {
               pivot=(low+high)/2;
               mergesort(a,b,low,pivot);/*1st*/
               mergesort(a,b,pivot+1,high);/*2nd*/
               merge(a,b,low,pivot,high);
       }
     return ;
}
mergesort(int*a、int*b、int-low、int-high)
{
整型枢轴
如果(低
我的问题是为什么要调用mergesort(a,b,pivot+1,high)

之所以调用mergesort(a,b,pivot+1,high),是因为前面的语句mergesort(a,b,low,pivot)只对数组的下半部分进行排序,而上半部分仍然需要排序,以便合并(a,b,low,pivot,high)有效(如果数组的部分没有排序的话)

例如 假设有一个大小为5{e,d,c,b,a}的数组

最初,mergesort(a、b、low、pivot)仅从低点排序到轴(包括轴),而mergesort(a、b、pivot+1、high)从轴(不包括轴)排序到高点。

在我提供的示例中,这意味着第一次调用mergesort时,枢轴将是c。这意味着{e,b,c}将全部按第一次mergesort排序,而{b,a}将按第二次mergesort排序


有关更多信息,请参见此

,以跟进Rohlex32的答案(他的答案应获得正确答案的认可)

我的问题是为什么要调用mergesort(a,b,pivot+1,high)

正如Rohlex32所回答的,这是因为mergesort(a,b,low,high)使用high作为最后一个要排序的索引,所以mergesort(a,b,low,pivot)包含[pivot]处的元素

mergesort的另一种实现使用开始索引和结束索引,其中结束索引比最后一个索引大1

mergesort(a, b, 0, sizeof(a)/sizeof(a[0]));
这样的mergesort函数与上面的函数稍有不同:

void mergesort(int *a, int *b, int begin, int end)
{
    int mid = (begin+end)/2;
    if((end - begin) < 2)
        return;
    mergesort(a, b, begin, mid);    // sort from begin to mid-1
    mergesort(a, b, mid, end);      // sort from mid   to end-1
    merge(a, b, begin, mid, end);   // merge the two parts
}
void合并排序(int*a、int*b、int开始、int结束)
{
int mid=(开始+结束)/2;
如果((结束-开始)<2)
回来
mergesort(a,b,begin,mid);//从begin排序到mid-1
mergesort(a,b,mid,end);//从mid排序到end-1
合并(a,b,开始,中间,结束);//合并这两部分
}

这个问题对我来说毫无意义。@AlKepp你没有回答什么understand@Ankush你意识到
mergesort
是一个函数,对吗?Q:当函数返回时会发生什么?a:你继续下一个计算,在这种情况下,下一行…@pjs oops这是一个错误。Q:你明白我的问题了吗?@Ankush不,没有问题就可以了显式返回语句。函数可以通过终止返回,这是您的算法在编辑之前所做的。