Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Mergesort - Fatal编程技术网

Algorithm 在合并排序中,为什么不将每个已排序的子列表合并到一个滚动列表中?

Algorithm 在合并排序中,为什么不将每个已排序的子列表合并到一个滚动列表中?,algorithm,sorting,mergesort,Algorithm,Sorting,Mergesort,所以对于拆分时的合并排序,我会 HGFEDCBA HG FE DC BA H G F E D C B A 用于合并而不是 GH EF DC AB EFGH ABCD ABCDEFGH 为什么不呢 H G F E D C B A GH F E D C B A FGH E D C B A EFGH D C B A DEFGH C B A CDEFGH B A CBDEFGH A ABCDEFGH 我能想到的唯一一件事是,合并排序通常是递归实现的,如果使用递归进行拆分,那么使用第一种方法进行

所以对于拆分时的合并排序,我会

HGFEDCBA
HG FE DC BA
H G F E D C B A
用于合并而不是

GH EF DC AB
EFGH  ABCD
ABCDEFGH

为什么不呢

H G F E D C B A
GH F E D C B A
FGH E D C B A
EFGH D C B A
DEFGH C B A
CDEFGH B A
CBDEFGH A
ABCDEFGH 

我能想到的唯一一件事是,合并排序通常是递归实现的,如果使用递归进行拆分,那么使用第一种方法进行合并会更容易

正如一些评论所提到的,您的第二张图片实际上描述的是插入排序,而不是合并排序。我理解您的困惑,因为在您的示例中,插入排序比合并排序运行得更快。反向列表的插入排序为O(n),因为添加到输出数组的每个新元素在插入之前只需要比较一个元素。然而,合并排序在所有情况下都需要O(n logn)比较


但您可以正确地说,合并排序通常比插入排序具有更少的比较。例如,如果列表已经排序(“ABCDEFGH”),则添加到输出中的每个新元素在添加到末尾之前都必须与整个输出进行比较,这将是O(n^2)时间复杂性。

我认为您描述的不是合并排序,而是插入排序。@MarkRansom lol!哦,是的,我现在明白了,这是有道理的。比较的数量更少,而且如果我以这种方式合并,就没有必要拆分以进行合并排序。