我很难理解递归合并排序算法是如何工作的,我理解它在理论上是如何工作的:如果一个数组中有多个元素,找到它的中间,将数组分成两个较小的子数组,依此类推,直到你有两个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]
从这里l==h,我们不满足条件l
有人能解释一下为什么算法在l==n之后继续称自己吗?我读了一些解释,看了一些视频,有些人甚至认为merge(l,mid)排序完整的上半部分[9,3],merge(mid 1,h)排序完整的下半部分[7,5],这显然不是它的工作原理,我真的很困惑。
通过信任递归算法,您可以理解它。请看下面的注释(!
开始注释):
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,从而立即返回到调用级别。
它不再调用自己,一旦完成当前步骤,它就会返回到递归中的前一步。
我知道合并排序算法的基本概念,但是当涉及到通过递归实现它时,我很难理解它是如何工作的。据我所知,合并排序函数将我们当前的数组分成两半,并使用递归我们一直这样做,直到每边只剩下一个元素。 如果我们的数组是{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