调用合并排序算法的机制

时间:2017-02-27 20:35:33

标签: algorithm sorting recursion mergesort

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

在调用if-conditon第二个mergesort函数的不满意之后,我无法理解。那怎么回事? Plz详细解释

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

2 个答案:

答案 0 :(得分:0)

  

我的问题是为什么要调用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}将全部按第一个合并排序排序,而{b,a}将按第二个合并排序排序。

有关详细信息,请参阅此answer

答案 1 :(得分:0)

跟进Rohlex32的回答(他的回答应该归功于正确答案)。

  

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

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

mergesort的替代实现使用开始和结束索引,其中结束索引比最后一个索引大1。对mergesort的初始调用将是

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
}