基础算法----希尔排序(Shell‘s Sort)

算法稳定性,时间复杂度,空间复杂度等算法基础知识经典算法----基础知识
冒泡排序基础算法----冒泡排序
选择排序基础算法----选择排序
插入排序基础算法----插入排序
快速排序基础算法----快速排序
希尔排序基础算法----希尔排序
归并排序基础算法----归并排序
计数排序基础算法----计数排序
桶排序基础算法----桶排序
基数排序基础算法----基数排序
堆排序基础算法----堆排序

一 算法简介

取一个增量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
increment = 4


2) increment = 2
increment = 2


3) increment = 1

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值