Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 理解合并排序算法_Algorithm_Sorting_Recursion_Data Structures_Mergesort - Fatal编程技术网

Algorithm 理解合并排序算法

Algorithm 理解合并排序算法,algorithm,sorting,recursion,data-structures,mergesort,Algorithm,Sorting,Recursion,Data Structures,Mergesort,我将介绍合并排序算法,并尝试使用以下算法递归地理解其方法: MergeSort(A, p, r) If p > r return; q = (p+r)/2; mergeSort(A, p, q) mergeSort(A, q+1, r) merge(A, p, q, r) 我试着对一个3号的数组进行干运行 [0,1,2] mergesort(A,0,2)----[0,1,2] mergesort(A,0,1)----[0,1] mergesort(A,0,0)----[0]

我将介绍合并排序算法,并尝试使用以下算法递归地理解其方法:

MergeSort(A, p, r)
If p > r 
    return;
q = (p+r)/2;
mergeSort(A, p, q) 
mergeSort(A, q+1, r)
merge(A, p, q, r)
我试着对一个3号的数组进行干运行

[0,1,2]
mergesort(A,0,2)----[0,1,2]
mergesort(A,0,1)----[0,1]
mergesort(A,0,0)----[0]
mergesort(A,1,2)----[1,2]
mergesort(A,2,2)----[2]
merge(A,0,1,2)
虽然我能理解它的基本分治技术,但我不能正确地进行试运行。我知道我遗漏了一些东西。有人能帮我或指出遗漏的部分吗

请注意,我只关心如何干运行此算法。

if需要修复:

MergeSort(A, p, r)
If p >= r 
    return;
q = (p+r)/2;
mergeSort(A, p, q) 
mergeSort(A, q+1, r)
merge(A, p, q, r)
示例干运行,缩进表示递归级别

[0,1,2]
mergesort(A,0,2)--------[0,1,2]
  mergesort(A,0,1)------[0,1]
    mergesort(A,0,0)----[0]
    mergesort(A,1,1)----[1]
    merge(A,0,0,1)------[0]+[1]
  mergesort(A,2,2)------[2]
  merge(A,0,1,2)--------[0,1]+[2]
将变量更改为b(开始)、e(结束=最后+1)、m(中间)

另一个例子是试运行

[0,1,2]
mergesort(A,0,3)--------[0,1,2]
  mergesort(A,0,1)------[0]
  mergesort(A,1,3)------[1,2]
    mergesort(A,1,2)----[1]
    mergesort(A,2,3)----[2]
    merge(A,1,2,3)------[1]+[2]
  merge(A,0,1,3)--------[0]+[1,2]
[0,1,2,3]
mergesort(A,0,4)--------[0,1,2,3]
  mergesort(A,0,2)------[0,1]
    mergesort(A,0,1)----[0]
    mergesort(A,1,2)----[1]
    merge(A,0,1,2)------[0]+[1]
  mergesort(A,2,4)------[2,3]
    mergesort(A,2,3)----[2]
    mergesort(A,3,4)----[3]
    merge(A,2,3,4)------[2]+[3]
  merge(A,0,2,4)--------[0,1]+[2,3]
if需要修复:

MergeSort(A, p, r)
If p >= r 
    return;
q = (p+r)/2;
mergeSort(A, p, q) 
mergeSort(A, q+1, r)
merge(A, p, q, r)
示例干运行,缩进表示递归级别

[0,1,2]
mergesort(A,0,2)--------[0,1,2]
  mergesort(A,0,1)------[0,1]
    mergesort(A,0,0)----[0]
    mergesort(A,1,1)----[1]
    merge(A,0,0,1)------[0]+[1]
  mergesort(A,2,2)------[2]
  merge(A,0,1,2)--------[0,1]+[2]
将变量更改为b(开始)、e(结束=最后+1)、m(中间)

另一个例子是试运行

[0,1,2]
mergesort(A,0,3)--------[0,1,2]
  mergesort(A,0,1)------[0]
  mergesort(A,1,3)------[1,2]
    mergesort(A,1,2)----[1]
    mergesort(A,2,3)----[2]
    merge(A,1,2,3)------[1]+[2]
  merge(A,0,1,3)--------[0]+[1,2]
[0,1,2,3]
mergesort(A,0,4)--------[0,1,2,3]
  mergesort(A,0,2)------[0,1]
    mergesort(A,0,1)----[0]
    mergesort(A,1,2)----[1]
    merge(A,0,1,2)------[0]+[1]
  mergesort(A,2,4)------[2,3]
    mergesort(A,2,3)----[2]
    mergesort(A,3,4)----[3]
    merge(A,2,3,4)------[2]+[3]
  merge(A,0,2,4)--------[0,1]+[2,3]

你能试着解释一下你的代码出了什么问题并提出一个明确的问题吗?目前,恐怕不太清楚。也许可以在尚未排序的数组上尝试。@maxpaj这段代码对我来说似乎是正确的。我关心的是这个算法在纸和笔上的枯燥运行,这让我感到困惑。请看上面的动画,看看这是否有帮助。@MarkRansom-这应该是mergesort的每对调用(用于左半部分和右半部分)之后是对merge的调用。请注意,在递归生成两次各1个元素的运行之前,不会发生任何合并操作,然后合并过程将继续,左/深优先。能否尝试解释代码的错误并说明一个明确的问题?目前,我恐怕不太清楚。也许可以在尚未生成sor的数组上尝试ted@maxpaj这段代码对我来说似乎是对的。我关心的是这个算法在纸和笔上的干运行,这让我感到困惑。看看上面的动画,看看是否有帮助。@Markransem-这应该是对mergesort的每一对调用(对于左半部分和右半部分)之后是对merge的调用。请注意,在递归生成两次各1个元素的运行之前,不会发生任何合并操作,然后合并过程继续,左/深度优先。这里有一个问题:据我所知,在mergesort(a,0,0)之后它将返回。因此mergesort(a,q+1,r)应该调用,而r永远不会更新。基本上,您是如何将下一步归纳为mergesort(A,1,1)的。您可以更新这两个函数中的哪一个,即mergesort(A,p,q)和mergesort(A,q+1,r)在哪一步被调用。@AnkushDutt-问题在于每一级递归都会得到一组新的p,q,r。因此,按照相同递归级别(在我的示例中是缩进)的调用顺序进行操作,这将始终是| mergesort(a,p,q)| mergesort(a,q+1,r)| merge(a,p,q,r)|,对于第一级递归,mergesort(A,0,0)=合并排序(A,p,q)和合并排序(A,1,1)=合并排序(A,q+1,r)。这里有一个问题:据我的理解,在合并排序(A,0,0)之后它会返回。因此应该调用合并排序(A,q+1,r),并且永远不会更新r。基本上,您是如何将下一步总结为合并排序(A,1,1)的。您能否更新在哪一步调用两个函数,即mergeSort(A,p,q)和mergeSort(A,q+1,r)中的哪一个。@AnkushDutt-问题是在每一级递归中,您都会得到一组新的p,q,r。因此,请遵循相同递归级别的调用顺序(在我的示例中缩进),它将始终是| mergesort(A,p,q)| mergesort(A,q+1,r)| merge(A,p,q,r)|,对于第一级递归,mergesort(A,0,0)=mergesort(A,p,q),和mergesort(A,1,1)=mergesort(A,q+1,r)。