合并排序递归错误
Merge sort Recursion Error
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);
来自ALgorithms: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) ?
假设您的数组是 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)
确保第四次调用在这里结束并控制 returns 到第三次调用。
第三次调用的输入是 { 2, 4 }
。我们刚刚结束行 Mergesort(a,p,q);
,因此我们知道输入的前半部分已排序。 第五次 调用(第 Mergesort(a,q+1,r);
行)现在将对下半部分进行排序。
在第五次调用时 p=1, q=1
。输入再次是长度为 1 的数组,因此默认排序。控制returns到第三次调用
第三次调用现在正在评估行 Merge(a,p,q,r);
。前半部分已排序,后半部分已排序:Merge(a,p,q,r);
取这两半并移动元素,确保 whole 子数组从索引 p
到索引 r
已排序。第三次通话结束
第二个调用 { 2, 4, 6, 1 }
有输入。前半部分已排序,现在仍然是后半部分:调用之后输入变为 { 2, 4, 1, 6 }
。在调用 Merge
之后,输入变为 { 1, 2, 4, 6 }
并且第二个调用结束,将控制权返回给第一个调用。
第一个调用现在需要对 它的 输入的后半部分进行排序,顺便说一下,这是整个数组。和以前一样完成。
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);
来自ALgorithms: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) ?
假设您的数组是 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)
确保第四次调用在这里结束并控制 returns 到第三次调用。
第三次调用的输入是 { 2, 4 }
。我们刚刚结束行 Mergesort(a,p,q);
,因此我们知道输入的前半部分已排序。 第五次 调用(第 Mergesort(a,q+1,r);
行)现在将对下半部分进行排序。
在第五次调用时 p=1, q=1
。输入再次是长度为 1 的数组,因此默认排序。控制returns到第三次调用
第三次调用现在正在评估行 Merge(a,p,q,r);
。前半部分已排序,后半部分已排序:Merge(a,p,q,r);
取这两半并移动元素,确保 whole 子数组从索引 p
到索引 r
已排序。第三次通话结束
第二个调用 { 2, 4, 6, 1 }
有输入。前半部分已排序,现在仍然是后半部分:调用之后输入变为 { 2, 4, 1, 6 }
。在调用 Merge
之后,输入变为 { 1, 2, 4, 6 }
并且第二个调用结束,将控制权返回给第一个调用。
第一个调用现在需要对 它的 输入的后半部分进行排序,顺便说一下,这是整个数组。和以前一样完成。