算法稳定性,时间复杂度,空间复杂度等算法基础知识:经典算法----基础知识
冒泡排序:基础算法----冒泡排序
选择排序:基础算法----选择排序
插入排序:基础算法----插入排序
快速排序:基础算法----快速排序
希尔排序:基础算法----希尔排序
归并排序:基础算法----归并排序
计数排序:基础算法----计数排序
桶排序: 基础算法----桶排序
基数排序:基础算法----基数排序
堆排序: 基础算法----堆排序
一 算法简介
取一个增量increment(一般是待排序序列长度的一半,向下取整)作为间隔,所有距离为increment的元素放在同一组中,对每组进行插入排序,然后缩小间隔increment(每次缩小一半,向下取整),直到最后increment=1
希尔排序是插入排序的一种,又称"缩小增量排序"(Diminishing Increment Sort),是基于直接插入排序算法的改进版本
希尔排序实质上是一种分组的插入排序
二 时间复杂度,空间复杂度
一) 时间复杂度
由于增量increment的取值方法很多,导致希尔排序的时间复杂度很难计算,因此希尔排序的时间复杂度并不能通过数学公式计算
时间复杂度为T(n) = O(nlog2n) ~ O(n2)
二) 空间复杂度
希尔排序不需要额外的空间,所以空间复杂度为 S(n) = O(1)
三 算法稳定性
一次插入排序是稳定的,不会改变相同元素的相对顺序
希尔排序会进行多次插入排序,在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱
希尔排序是一种不稳定的排序算法
四 实现
一) 步骤
1) 取一个增量increment(一般是待排序序列长度的一半,向下取整)作为间隔,所有距离为increment的元素放在同一组中
2) 对每组进行插入排序,然后缩小间隔increment(每次缩小一半,向下取整)
3) 重复步骤 1), 2),直到最后increment=1,对整个序列进行一次插入排序
二) 过程图
使用 {40, 30, 50, 40, 20, 60, 10, 70} 演示从小到大的排序过程
初始状态
1) increment = 4
2) increment = 2
![increment = 2](https://i-blog.csdnimg.cn/blog_migrate/a60a98f4d59dcf51028bc01667aafe60.png)
3) increment = 1
三) 代码实现
func ShellsSort(arr []int) {
if len(arr) <= 1 {
return
}
//外层for循环控制步长
for increment := len(arr)/2; increment > 0; increment /= 2 {
//里层的双层for循环表示插入排序
for i := increment; i < len(arr); i += increment {
for j := i - increment; j >= 0 && arr[j] > arr[j+increment]; j -= increment {
arr[j], arr[j+increment] = arr[j+increment], arr[j]
}
}
}
return
}