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_Data Structures_Binary Search Tree_Mergesort - Fatal编程技术网

Algorithm 无法理解合并排序算法中实际创建了多少个数组

Algorithm 无法理解合并排序算法中实际创建了多少个数组,algorithm,sorting,data-structures,binary-search-tree,mergesort,Algorithm,Sorting,Data Structures,Binary Search Tree,Mergesort,我一直在研究合并排序算法,但我无法得出结论,作为该算法的一部分,实际创建了多少个数组。某些文献说,整个原始数组被复制到一个新的数组中,并进行排序。但这意味着只创建了2个数组 据我所知,合并排序算法有两个主要步骤。拆分和合并。我想如果给merge-sort一个包含100个插槽的数组,它实际上会创建新的数组,因为它从100>50/50>25/25>12/13>6/5>3/3>1/1的中间拆分。在所有这些拆分之后,它在内存中有12或13个数组。最后,它将所有这些从1>2>3或4>6>12>25>50>

我一直在研究合并排序算法,但我无法得出结论,作为该算法的一部分,实际创建了多少个数组。某些文献说,整个原始数组被复制到一个新的数组中,并进行排序。但这意味着只创建了2个数组

据我所知,合并排序算法有两个主要步骤。拆分和合并。我想如果给merge-sort一个包含100个插槽的数组,它实际上会创建新的数组,因为它从100>50/50>25/25>12/13>6/5>3/3>1/1的中间拆分。在所有这些拆分之后,它在内存中有12或13个数组。最后,它将所有这些从1>2>3或4>6>12>25>50>100复制到新数组中

这是另外8个数组(粗略地说)

但在教科书中,我读到如下内容:

您可能想知道所有这些子阵列在内存中的位置。在 算法中,创建与原始数组大小相同的工作空间数组 创建。子阵列存储在工作空间阵列的各个部分中。 这意味着原始阵列中的子阵列将复制到 工作区数组中的适当位置。在每次合并之后 工作空间数组将复制回原始数组

--Robert Lafore的Java数据结构和算法

即使“拆分”了数组,也不必创建两个新数组。 您总是有相同数量的插槽(此处为100个,即使是50*2或25*4…)

只需将数据移动到阵列中的正确位置(第一次拆分后,前50个插槽为第一个阵列,最后50个插槽为第二个阵列)


您不必存储数组,只需索引它们在大数组中的起始位置。

考虑典型合并排序实现的最后两个阶段。我们需要两个阵列-主阵列和辅助阵列,并将辅助阵列中的子阵列合并到主阵列中

在某些合并阶段(
|
表示每个数组块的开始(起始索引))-我们将一个子数组与B子数组合并以填充目标数组的前半部分,并将C子数组与D子数组合并以填充目标数组的后半部分:

Auxiliary array:  |AAAA|BBBB|CCCC|DDDD
Main array:       ..................
合并后(我使用任意顺序)

复制之后,最终合并之前

Auxiliary array:  |ABBABBAA|DCDDCCDC
Main array:      ................

这本教科书提到了合理高效的合并实现,其中一次性分配了与原始阵列大小相同的工作空间数组。在该点之后,所有要合并的子数组都是工作空间数组或原始数组的一部分,通过索引(或指针)访问


自顶向下的合并排序使用递归生成一个动态的索引对堆栈来表示子数组。自底向上的合并排序跳过递归,并使用迭代生成索引,从子数组大小1开始。

您可以就地实现合并排序:。或者不是。因此,创建的数组数量取决于实现。提供的这些注释没有给出足够的细节。当然,这取决于实施情况。但假设它不是一个就地合并排序(火箭科学)。这是CS101中的基本合并排序,那么创建了多少个数组?所以实际上只有2个数组?我指的是合并排序的递归方法。因此,相同的数组被传递给递归调用或Merge sort and Merge()?是的,只有2个数组。请看这里的第一个代码:-数组A和B(合并阶段的目标数组是aux B)
Auxiliary array:  |ABBABBAA|DCDDCCDC
Main array:      ................