基本思想
使用插入排序将相距gap的所有数据排序,然后缩小gap直至gap=0,排序结束。显然当初始gap=1时,退化为直接排序。该算法是最早摆脱O(n2)的排序算法之一。
算法分析
时间复杂度
最坏:取gap=1时,O(n2)
最好:Hibbard增量的希尔排序的时间复杂度为O(n3/2)。
空间复杂度
O(1)
稳定性
不稳定
参考代码
//希尔排序,插入排序的一种更高效的改进版本。
func shellSortAsc(value common.Value) {
gap := len(value) / 2
for gap > 0 {
for i := gap; i < len(value); i++ {
for j := i; j >= gap; j -= gap {
if value.Less(j, j-gap) {
value.Swap(j, j-gap)
} else {
break
}
}
}
gap /= 2
}
}