合并排序跟踪说明

时间:2017-06-30 06:49:24

标签: java arrays algorithm sorting mergesort

我在跟踪合并排序过程时遇到了一些困难...... 从概念上讲,我理解一个未排序的数组将被分割,直到它的子数组的子数组变为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处索引

1 个答案:

答案 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的内容将用作pr