贝壳排序算法简介

350 阅读2分钟

贝壳排序是一种排序技术,它将一个给定的列表分成子列表,然后用插入排序对它们进行排序。该算法使用一个间隙n,选择相隔n个间隙的项目来组成子列表。

然后使用插入排序对子列表进行排序,之后再将它们合并。合并后的列表不是完全排序的,但是给算法带来了项目更接近其最终位置的优势。

插入排序再次被用来对列表进行最终排序。

近距离观察Shell排序

上面的描述可能没有什么意义,但一个例子应该会有帮助。假设你有一个列表。[39, 6, 2, 51, 30, 42, 7, 4, 16],间隙值为3。

第一个子列表将有项目。39, 51, 7

第二个子列表。6, 30, 4

第三和最后一个子列表。2, 42, 16

在插入排序后,每个子列表将被排序如下。

第一个:7,39,51

第二个:4,6,30

第三个:2,16,42

排序后的子列表现在以一种特殊的方式进行组合。每个子列表的项目都被放在索引中,而原始的未排序子列表的值就是从这个索引中收集的。

相关的。泡沫排序算法简介

因此,你最终会得到下面这个序列。

[7, 4, 2, 39, 6, 16, 51, 30, 42]

注意,该列表仍未排序,但项目更接近它们应该在的位置。在对这个列表组合执行插入排序后,列表最终将被排序。

[2, 4, 6, 7, 16, 30, 39, 42, 51]

算法分析

shell排序的复杂度在O(n)和O(n2)之间。这个结论的计算已经超出了本文的范围。

Python的实现。

def shellSort(my_list):n = len(my_list)interval = n // 2 # floor divisionwhile interval > 0:for val in range(interval, n):temp = my_list[val]x = valwhile x >= interval and my_list[x - interval] > temp:my_list[x] = my_list[x - interval]x = x - intervalmy_list[x] = tempinterval = interval // 2 

转到合并排序

有几种排序算法,每种都有独特的工作方式。例如,合并排序使用分而治之的策略,其复杂性为O(nlogn)。

在某些情况下,合并排序比shell排序更好,绝对值得关注。它应该是你的排序算法阅读清单上的下一个项目。