Toptal连接了前3%的 自由开发人员 世界各地.

壳类

动画,代码,分析和讨论的shell排序在4个初始条件.

使用方法: 新闻 “玩”,或选择  玩  button.

所有玩
播放动画
随机
播放动画
近排序
播放动画
逆转
播放动画
一些独特的

算法

h = 1
while h < n, h = 3*h + 1
while h > 0,
    h = h / 3
    对于k = 1:h,插入排序a[k:h:n]
    →不变式:每个h-子数组排序
结束

讨论

蛋壳排序的最坏情况下的时间复杂度取决于增量序列. 对于增量 1 4 13 40 121…这里用的就是这个,时间复杂度是O(n3/2). 对于其他增量,已知时间复杂度为O(n)4/3),甚至O(n·lg)2(n)). 时间复杂度的严格上界和最佳增量序列都不知道.

因为shell排序是基于插入排序的, Shell排序继承插入排序的自适应属性. 这种调整并不引人注目,因为shell排序需要对每个增量进行一次数据遍历, 但这很重要. 对于上面显示的增量序列,有log3(n)个增量,所以近排序数据的时间复杂度为O(n·log)3(n)).

因为它的开销很低, 相对简单的实现, 自适应特性, 以及次二次的时间复杂度, 对于某些应用程序,当要排序的数据不是很大时,shell排序可能是O(n·lg(n))排序算法的可行替代方案.

关键

  • 黑色值排序.
  • 灰度值未排序.
  • 深灰色值显示正在使用插入排序排序的当前子数组.
  • 红色三角形标记算法位置.

属性

  • 不稳定
  • O(1)额外空间
  • O(n3/2)时间如下所示(见下文)
  • 自适应:接近排序时O(n·lg(n))时间

准备技术面试? 看看我们的采访指南吧.