当前位置: 首页 > 知识库问答 >
问题:

递归自顶向下合并排序

宿洋
2023-03-14

我正在尝试理解递归排序函数,它是mergesort算法的一部分。下面是我的代码,我几乎可以肯定它是正确的(通过在线课程)。

    private static void sort(Comparable[] a, Comparable[] aux, int low, int high) {
         if (high <= low) return;
         int mid = low + (high - low) / 2;
         sort (a, aux, low, mid);
         sort (a, aux, mid+1, high);
         merge(a, aux, low, mid, high);
   }

我理解合并的作用——它将每个子数组分解成两个较小的子数组,重复这个过程,直到子数组的长度为1(根据定义排序),然后合并。然而,这个排序函数用来完成这个任务的实际方法对我来说很难理解。也许是因为我不习惯递归函数,但是我想知道是否有人可以在第一次合并发生时阐明操作的顺序和参数是什么。

例如,当它点击第一个递归调用进行排序(a,aux,low,mid)时,它是否会中断操作而不继续执行下面的第二个排序和合并函数,而是立即使用新参数再次调用排序?在这种情况下,第二次调用什么时候进行排序;排序(a,辅助,中1,高);发生

谢谢你的帮助。这是我第一次在这里发布,如果有任何格式问题,请告诉我。

共有2个答案

湛联
2023-03-14

如果您没有得到任何信息,请对每个步骤进行说明:

 if (high <= low) return; // if your high and low numbers are the same then this part of the loop is finished and it will start going back up
 int mid = low + (high - low) / 2;//sets mid
 sort (a, aux, low, mid);//recursively calls itself so that it will eventually hit the first if. This handles from low to mid
 sort (a, aux, mid+1, high); //this handles from mid+1 to high
 merge(a, aux, low, mid, high); //This is where the merge starts. 

我发现,如果你真的很困难,可以运行一个简单的示例,并在纸上和笔上通读它。

池恩
2023-03-14

当它点击第一次递归调用排序(a, aux, low, mid)时,它是否会中断操作,不继续进行第二次排序和下面的合并函数,而是立即使用新参数再次调用排序?

  • 是的。它再次调用函数(Recursion)以获取新参数,然后继续下去,直到对该部分进行排序

在这种情况下,什么时候第二次调用排序;排序(a,aux,mid 1,high);发生?

    < li >执行完第一个调用后。(第一部分排序完成时)。
 类似资料:
  • 我正在尝试实现合并排序,其中原始数组和辅助数组为每个递归交替。它基于Java代码。描述如下(链接): 改进。通过对实现进行一些经过仔细考虑的修改,我们可以大幅缩短mergesort的运行时间。 [...] 消除到辅助阵列的副本。可以消除复制到用于合并的辅助阵列所需的时间(但不是空间)。为此,我们使用了两个sort方法调用,一个调用从给定数组中获取其输入,并将排序后的输出放入辅助数组中;另一个从辅助

  • 我有个小问题。我尝试实现合并排序算法递归。 现在我的问题: 左=合并排序(rrays.copyOfRange(iv_sort_list,0,iv_sort_list.length));右=合并排序(rrays.copyOfRange(iv_sort_list,iv_sort_list.length,iv_sort_list.length)); 如果我尝试分配我的左/右数组“mergeSort(..

  • 我正在尝试编写一个ruby方法,它可以递归地执行合并排序。我有这个方法,但这是一次我偶然得到它的工作,所以我不知道它为什么工作,并很想了解我写的代码是如何工作的。在psuedocode中,我遵循的步骤如下所示。 拆分长度为n的原始数组,直到我拥有长度为1的n个数组 一次合并和排序长度为m的2个数组,以返回长度为m*2的数组 重复上述步骤,直到我有一个长度为n的当前排序数组 基本上,在我看来,这是一

  • 我试图解决Leetcode上最长的回文子串。我知道这个问题的解决方案,比如围绕中心展开或动态编程自下而上的方法。出于纯粹的教育目的,我想以自上而下的递归方式解决这个问题。我试图找到类似于这里或这里描述的解决方案。(问题略有不同)。我有这个功能: 它接受搜索的字符串开始和结束位置。返回的元组是最长palindrom的开始和结束。我试图分成以下情况: 如果s[i]==s[j],则调查最长(s,i 1,

  • 我写了3个方法来实现递归合并排序,参数数量有限(没有aux、lo、mid、hi)。我认为我的工作是这样的,但它并没有返回一个排序数组,尽管它在运行时没有任何编译错误。我已经摆弄了4个小时,似乎无法弄清楚我做错了什么,没有合并一个有序数组。我只从我的助教那里得到了非常模糊的输入,并且能够修复我正在遇到的一些问题,但是该方法仍然没有对项数组进行排序。欢迎任何关于我在这里做错了什么的建议。谢谢!

  • 目前正在用Daniel Liang的C++入门自学C++。 关于合并排序的话题,我似乎无法理解他的代码是如何递归调用自己的。 我理解合并排序的一般概念,但我很难具体理解这段代码。 在本例中,我们首先将列表1,7,3,4,9,3,3,1,2及其大小(9)传递给mergeSort函数。从那里,我们将列表一分为二,直到数组大小达到1。在这种情况下,我们会得到:1,7,3,4->1,7->1。然后我们进入