希尔排序
前言
插入排序在某些情况下,效率是很高的。
比如我们的记录本身就是基本有序的,只需要少量的插入操作。
再比如,记录少的时候,插入排序效率的优势也是很明显的。
可是现实中,哪有那么理想的情况啊[>_<]
没有环境,那我们就要自己创造啊!!!
基本有序:
所谓的基本有序就是小的关键字在前面,大的基本在后面,不大不小的基本在中间。
希尔排序的思想核心
关键词: 步长
、分组
我们首先根据一定的步长
,将原有的记录进行分组
。
在分组内,使用插入排序把分组变成有序。
然后调整增量
,继续对分组做插入排序
处理。
直至最后步长变为1
,此时整个记录已经基本有序了,再进行少量的插入操作,就可以把整个记录变成有序。
举个例子:
代码实现
func shellSortStep(arr []int, start int, gap int) []int {
// 数组长度
length := len(arr)
// 插入排序的变种
for i := start + gap; i < length; i += gap {
// 备份待插入的数据
backup := arr[i]
// 初始化待插入位置
j := i - gap
// 待插入数据,小于前面的数据
for j >= 0 &&