Shell排序和插入排序

时间:2013-01-31 06:09:26

标签: algorithm data-structures

我遇到了问题。我对shell排序和插入排序算法非常困惑。我们应该如何相互区分?

3 个答案:

答案 0 :(得分:5)

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

不同之处在于:Insertion排序仅适用于一个序列(最初是数组的第一个元素)并对其进行扩展(使用下一个元素)。 但是,shell排序有递减增量,这意味着比较元素之间存在差距(最初 n / 2 )。因此,使用插入排序对 n / 2 序列进行排序。在每个步骤中,增量都会缩小(通常只是除以 2.2 ),并且序列数量会减少。在最后一步中没有间隙,算法退化为简单的插入排序。

由于增量递减,大小元素会快速移动以纠正数组的一部分,而在最后一步中使用插入排序的速度非常快。这导致时间复杂度降低 O(n ^(4/3))

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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