Data Structures Algorithms 简明教程
Shell Sort Algorithm
希尔排序是一种高效的排序算法,基于插入排序算法。该算法避免了插入排序情况下的大量移动,即当较小的值位于最右侧并且必须移动到最左侧时。
该算法对范围较广的元素使用插入排序,先对它们进行排序,再对间隔较小的元素进行排序。这种间距被称为 interval 。该间隔是根据克努斯公式计算的:
h = h * 3 + 1
where −
h is interval with initial value 1
它针对中等规模的数据集具有相当高的效率,因为它的平均和最坏情况复杂度为 O(n),其中 n 是项目的数量。
Shell Sort Algorithm
以下是希尔排序的算法。
1. Initialize the value of h.
2. Divide the list into smaller sub-list of equal interval h.
3. Sort these sub-lists using insertion sort.
4. Repeat until complete list is sorted.
Pseudocode
以下是希尔排序的伪代码。
procedure shellSort()
A : array of items
/* calculate interval*/
while interval < A.length /3 do:
interval = interval * 3 + 1
end while
while interval > 0 do:
for outer = interval; outer < A.length; outer ++ do:
/* select value to be inserted */
valueToInsert = A[outer]
inner = outer;
/*shift element towards right*/
while inner > interval -1 && A[inner - interval]
>= valueToInsert do:
A[inner] = A[inner - interval]
inner = inner – interval
end while
/* insert the number at hole position */
A[inner] = valueToInsert
end for
/* calculate interval*/
interval = (interval -1) /3;
end while
end procedure
Example
让我们考虑以下示例,了解希尔排序是如何工作的。我们使用在之前示例中使用过的同一个数组。为理解方便起见,我们采用 4 的间隔。创建一个虚拟子列表,其中包含所有位于 4 个位置间隔处的值。此处的这些值是 {35、14}、{33、19}、{42、27} 和 {10、14}
我们比较每个子列表中的值,并在原始数组中交换它们(如果必要)。此步骤结束后,新数组应如下所示 −
然后,我们采用 2 的间隔,此间距生成两个子列表 - {14、27、35、42}、{19、10、33、44}
我们比较该原始数组中的值,并在必要时交换它们。此步骤结束后,数组应如下所示 −
最后,我们使用 1 的间隔对数组的其余部分进行排序。希尔排序使用插入排序对数组进行排序。
以下是逐步描述 −
我们看到只交换了四次就对数组的其余部分进行排序。