合并排序递归错误

时间:2015-12-01 16:04:19

标签: java algorithm recursion mergesort

   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) )?

1 个答案:

答案 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,第二个呼叫结束,将控制权返回给第一个呼叫。

第一个调用现在需要对输入的后半部分进行排序,顺便说一句就是整个数组。这是像以前一样完成的。