【问题标题】:Merge sort Recursion Error合并排序递归错误
【发布时间】:2023-03-16 12:34:01
【问题描述】:
   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

在第一次递归调用中,我得到了三个然后控制从这里到哪里我被击中 2 它将调用下一个函数 mergesort(a,q+1,r) 和 merge(a,p,q,r ) ?

【问题讨论】:

标签: java algorithm recursion mergesort


【解决方案1】:

假设您的数组是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&lt;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 到索引r整个 子数组已排序。第三次通话结束。

第二个电话有{ 2, 4, 6, 1 } 有输入。前半部分已排序,现在保留后半部分:调用后输入变为{ 2, 4, 1, 6 }。调用Merge 后,输入变为{ 1, 2, 4, 6 },第二次调用结束,将控制权返回给第一次调用。

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

【讨论】:

  • 我开始递归调用 Merge(a,0,0) ,Merge(a,1,1,),Merge(a,2,2,) 和 Merge(a,3,3 ) 现在如何评估第五个表达式? @阿斯哈巴德
猜你喜欢
  • 2015-06-12
  • 2017-04-28
  • 2021-08-01
  • 1970-01-01
  • 2021-11-06
  • 2019-01-22
相关资源
最近更新 更多