Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
6年前关闭。
例如,让我以合并排序为例
mergesort(int a[], int low, int high)
{
  int mid;
  if(low<high)
  {
   mid=(low+high)/2;
   mergesort(a,low,mid);
   mergesort(a,mid+1,high);
   merge(a,low,high,mid);
  }
}

在此执行递归语句的顺序
我读过一些与逻辑有关的树结构,但我很难理解它。。
请帮帮我已经被困在上面很久了

最佳答案

它基本上是一个二叉树的预序遍历。
只有一个线程,所以一切都按顺序执行。因此,当初始mergesort函数第一次调用自身时,同样的事情会一遍又一遍地发生,直到达到基本情况为止。这就是为什么在使用递归时,基本情况如此重要;否则,您将得到无限递归,并且。。。堆栈溢出!
从最顶层看问题,数组的下半部分被完全排序,然后上半部分被完全排序,然后这两个排序的数组被合并在一起,给您排序的整个数组。
从下一级向下,下半部分有自己的下半部分排序,然后是上半部分排序。这将一直持续到low < high为false。在这种情况下,函数只返回。然后在调用它的mergesort中调用第二个mergesort
如果你把它在纸上画出来,你会看到树从代表下半部分排序的一侧向下生长到根部,然后从另一侧向下生长,直到它碰到基本情况并回到根部。

07-24 09:51
查看更多