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

合并排序算法如何“上树”?

红经亘
2023-03-14

我很难理解递归合并排序算法是如何工作的,我理解它在理论上是如何工作的:如果一个数组中有多个元素,找到它的中间,将数组分成两个较小的子数组,依此类推,直到你有两个1个元素的数组,根据定义已经排序(基本情况),然后你可以使用合并算法合并它们,然后你爬上树,依此类推。

我试着用python实现它,用一些print语句一步一步地执行,它是可行的,但我真的不明白为什么它会这样工作。我将向你描述我的错误逻辑:

伪代码中l为低索引,h为高索引的算法:

merge_sort(l,h){

if(l < h){
mid = (l+h)//2
merge_sort(l,mid) 
merge_sort(mid+1,h)
merge(l,mid,h)
}

}

因此,对于一个arr=[9,3,7,5]

  • 我们称merge_sort(0,3)为全数组,l=0, h=3, mid1[9,3,7,5]
  • l

从这里l==h,我们不满足条件l

有人能解释一下为什么算法在l==n之后继续称自己吗?我读了一些解释,看了一些视频,有些人甚至认为merge(l,mid)排序完整的上半部分[9,3],merge(mid 1,h)排序完整的下半部分[7,5],这显然不是它的工作原理,我真的很困惑。

共有2个答案

益稳
2023-03-14

通过信任递归算法,您可以理解它。请看下面的注释(开始注释):

merge_sort(l,h) {

if (l < h) {
    mid = (l+h)//2
    merge_sort(l,mid) ! If merge_sort does its job, the array is now sorted from l to mid
    merge_sort(mid+1,h) ! If merge_sort does its job, the array is now sorted from mid+1 to h
    merge(l,mid,h) ! If merge does its job, the array is now sorted from l to h
}
else { ! If l==h, the array is already sorted from l to h
}

现在你可以看到,如果我们用一些值l和h调用这个函数,它将返回一个排序的数组,通过调用数组的各个部分,每次返回排序的数组。整个构造之所以有效,是因为子阵列的大小在调用级别之间不断减小,并且始终达到1,从而立即返回到调用级别。

殳自怡
2023-03-14

它不再调用自己,一旦完成当前步骤,它就会返回到递归中的前一步。

 类似资料:
  • 我知道合并排序算法的基本概念,但是当涉及到通过递归实现它时,我很难理解它是如何工作的。据我所知,合并排序函数将我们当前的数组分成两半,并使用递归我们一直这样做,直到每边只剩下一个元素。 如果我们的数组是{38、27、43、3、9、82、10},那么我们的递归将从使用子数组(原始数组的左侧)调用自身开始,并每次重复该过程,将数组减半并存储最左侧,直到达到1个元素: 然后在我们的第二个子例程中,我们继

  • 我在理解外部排序算法中的合并步骤时遇到了一定的困难。我在维基百科上看到了这个例子,但我无法理解。 外部排序的一个例子是外部合并排序算法,它对每个适合RAM的块进行排序,然后将排序后的块合并在一起。例如,对于仅使用100 MB RAM对900 MB数据进行排序:1)读取主内存中的100 MB数据,并通过一些常规方法进行排序,如快速排序。2) 将排序后的数据写入磁盘。3) 重复第1步和第2步,直到所有

  • 问题是关于从16:43到23:34的视频中的合并排序http://youtu.be/M814OagXWTI?t=16m43s 在退出左/右排序合并递归后,我不清楚我们是如何合并回这些子数组的。让我们从最底部开始,当我们的元素被分成两个子数组时,一个左子数组称为B,一个右子数组称为C。在16:43左右,我们跳转到合并函数,对数组B和C进行排序,这两个数组只有8和3。合并排序函数(下面的代码)基本上通

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

  • 我正在尝试实现一个不能正常工作的mergesort算法。合并排序的工作方式如下: i、 将未排序的列表划分为n个子列表,每个子列表包含1个元素(1个元素的列表被视为已排序)。 ii.重复合并子列表以产生新排序的子列表,直到只剩下1个子列表。这将是已排序的列表。下面提供了实现。 最初,递归调用此方法,直到只有一个元素。 这是提供的合并方法。 这里的问题是什么? 输入是输出是

  • 这些是家庭作业问题,但我想了解它们背后的概念,而不仅仅是得到答案。 我知道MergeSort的运行时间是O(nlogn)。似乎合并方法必须运行 n 次(因为它必须合并所有数组,最终会有 n 个数组)。因此,我想我可以推断出 MergeSort() 方法将被称为 logn times。我也认为这是有道理的,因为它正在划分数组,所以它会一直将自己除以 2,所以 logn。 因此,我觉得答案分别是C和A