第一个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 ;
}
答案 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
}