Mergesort(a,p,r){
if(p<r){
int q=[p+r]/2;
Mergesort(a,p,q);
Mergesort(a,q+1,r);
Merge(a,p,q,r);
来自“算法简介:Cormen”一书 在这里,我无法理解合并排序算法的递归调用
2 4 1 6 8 5 3 7
2 4 1 6
2 4
2
在第一次递归调用中,我得到了3,然后控制从这里开始,在2处,它将调用下一个函数mergesort(a,q + 1,r)并合并(a,p,q,r) )?
答案 0 :(得分:0)
假设您的数组是a = { 2, 4, 6, 1, 8, 5, 3, 7 }
。我交换了你提出的数组的两个元素。现在,接下来就是你的程序所做的事情,一个接一个叫。
第一次调用p=0, q=7
时:您的while数组是输入。
在第二次致电p=0, q=3
时,在第三次p=0, q=1
。
在第四次调用p=0, q=0
时:输入是子数组{ 2 }
。这个数组只有一个元素,因此排序:行if(p<r)
确保第四个调用在此结束,控制返回第三个调用。
第三个调用的输入为{ 2, 4 }
。我们刚刚结束了行Mergesort(a,p,q);
,因此我们知道输入的前半部分已经排序。 第五次调用(行Mergesort(a,q+1,r);
)现在将对下半部分进行排序。
第五次致电p=1, q=1
。输入再次是长度为1的数组,因此默认排序。控制权返回第三个呼叫。
第三个电话正在评估第Merge(a,p,q,r);
行。排序后半部分,后半部分排序:Merge(a,p,q,r);
取两半并移动元素,确保整个子阵列从索引p
转换为索引{{1} }已排序。第三个电话结束。
第二次调用r
有输入。上半部分已排序,现在仍然是下半部分:在该调用之后输入变为{ 2, 4, 6, 1 }
。调用{ 2, 4, 1, 6 }
后,输入变为Merge
,第二个呼叫结束,将控制权返回给第一个呼叫。
第一个调用现在需要对其输入的后半部分进行排序,顺便说一句就是整个数组。这是像以前一样完成的。