我在跟踪合并排序过程时遇到了一些困难...... 从概念上讲,我理解一个未排序的数组将被分割,直到它的子数组的子数组变为1的长度,其中它变成一个每个包含1个元素的数组,据说是排序的。 使用
mergeSort(A,p,r) //where p = lowest index, r = highest
if (p < r) {
q = (p+r) / 2
mergeSort(A,p,q)
mergeSort(A,q+1,r)
merge(A,p,q,r)
}
在一个未排序的数组中[3,5,2,1,6,4],其中p是元素3的索引,q是元素2的索引,r是元素4的索引。从我的理解, 由于调用mergeSort(A,p,q),它将首先分为[3,5,2];现在新的索引将是元素3的p,元素5的q,元素2的r;所以[3,5,2]将被分为[3,5],p和q是元素3的索引,r是元素5的索引;将分为[3]。我的问题是,[2](分割后的[3,5,2])是否被索引为p或q + 1?
....实际上,我觉得我的问题不够明确,所以以另一种方式提问, 因为[3,5,2,1,6,4]将被分为[3,5,2]和[1,6,4];将分为[3,5]和[2]; [1,6]和[4];这也将分为[3] [5]和[1] [6];哪个部门调用mergeSort(A,p,q),哪个部分调用mergeSort(A,q + 1,r)?是[1,6,4]也在元素1处索引为p,r在元素4处索引
答案 0 :(得分:2)
最简单的跟踪方法是拿铅笔和纸。并为自己做。
遵循任何规则?是的,当你调用一个函数然后执行funstion。 (或者你应该注意那个功能)。
我的意思是: -
mergesort([3, 5, 2, 1, 6, 4])
你打来电话。
然后你最终面对这一行
q = (p+r) / 2
mergeSort(A,p,q) [3,5,2] <------
mergeSort(A,q+1,r) [1,6,4]
merge(A,p,q,r)
现在你应该注意了
mergesort( [3,5,2] )
这样你就会继续下去。在某些时候你会达到这条线。
q = (p+r) / 2
mergeSort(A,p,q) [2,3,5] // this is sorted now
mergeSort(A,q+1,r) [1,6,4] <--------
merge(A,p,q,r)
继续这样下去。这样,您可以在某一点调用merge
,它将已排序的子数组合并到完整的排序数组中。
mergeSort(A,q+1,r)
时,不要打扰自己mergeSort(A,p,q)
。除非对此子阵列进行排序,否则不会对此进行并行处理。作为对第二个问题的回答,让我向您展示另一张照片。
[3, 5, 2, 1, 6, 4]
p q r
/\
[3,5,2] [1, 6, 4]
p q r p q r
| \ | \
[3,5] [2] [1, 6] [4]
p r p r
q q
/ \ |\
[3] [5] [1] [6]
这是在数组上调用mergesort的方式。
在recusrion中,每个函数调用都有自己的参数。在子数组的父数组中用作q的内容将用作p
或r
。