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 Shell排序和插入排序_Algorithm_Data Structures - Fatal编程技术网

Algorithm Shell排序和插入排序

Algorithm Shell排序和插入排序,algorithm,data-structures,Algorithm,Data Structures,我有个问题。我对shell排序和插入排序算法感到非常困惑。我们应该如何区分彼此 您可以将插入排序作为连续元素的一系列比较和交换来实现。这使它成为一种“稳定的类型”。相反,Shell sort比较并交换彼此相距较远的元素。这使它更快 我认为您的困惑来自这样一个事实:shell排序可以实现为应用于不同数据子集的多个插入排序。请注意,这些子集由数据序列的非连续元素组成 有关更多详细信息,请参阅维基百科;-) 是一种简单的就地O(N^2)排序。有点复杂,更难理解,在O(N^(5/4))附近。查看链接以获

我有个问题。我对shell排序和插入排序算法感到非常困惑。我们应该如何区分彼此

您可以将插入排序作为连续元素的一系列比较和交换来实现。这使它成为一种“稳定的类型”。相反,Shell sort比较并交换彼此相距较远的元素。这使它更快

我认为您的困惑来自这样一个事实:shell排序可以实现为应用于不同数据子集的多个插入排序。请注意,这些子集由数据序列的非连续元素组成

有关更多详细信息,请参阅维基百科;-)

是一种简单的就地O(N^2)排序。有点复杂,更难理解,在O(N^(5/4))附近。查看链接以获取示例——应该很容易看出区别。

是的通用版本。两种算法的基本原理相同。您有一个长度为n的排序序列,并将未排序的元素插入其中-您将得到n+1元素的长排序序列

区别如下:插入排序只对一个序列(最初是数组的第一个元素)起作用,并扩展它(使用下一个元素)。 但是,shell sort的增量逐渐减小,这意味着比较的元素之间存在差距(最初n/2)。因此,有n/2个序列需要使用插入排序进行排序。在每一步中,增量都会缩小(通常只除以2.2),序列的数量也会减少。最后一步没有间隙,算法退化为简单的插入排序


由于增量递减,大小元素将快速移动到数组的正确部分,并且比上一步使用插入排序进行排序的速度更快。这会降低时间复杂度O(n^(4/3))

它们是完全不同的算法。但是它是如何变得不同的呢?请解释一下……你读过维基百科的文章吗?他们对这两种算法给出了很好的解释。你可以问自己是否能将其中一种算法与其他算法或实现区分开来。假设您确实想要比较实现,那么对于不同类型的输入,这些算法的复杂性应该会更好。这是一个非常好的答案。所有的事实都在这里。非常感谢。N/2通常不是Shell排序的最佳起始增量。维基百科的文章中有一个关于选择增量的好章节。否则,这是一个很好的答案。