贝壳排序是一种排序技术,它将一个给定的列表分成子列表,然后用插入排序对它们进行排序。该算法使用一个间隙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排序更好,绝对值得关注。它应该是你的排序算法阅读清单上的下一个项目。