排序七部曲之(七)希尔排序

本文详细介绍了希尔排序的原理及其实现过程。希尔排序是对插入排序的一种改进,通过将待排序序列分割成若干个子序列并分别进行插入排序来提高效率。随着增量逐步减小直至为1,最终完成整个序列的排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

希尔排序的原理:本质上是插入排序。插入排序在某些情况下效率是很高的,比如需要排序的序列基本有序时,插入排序的效率可以接近O(N)。

那么问题在于,现实中的序列基本上都是不满足基本有序的,如何使一个序列在进行插入排序前是满足基本有序的呢?科学家希尔将插入排序进行了改进,提高了排序的效率。

希尔排序的实现:将待排序列分割成若干个子序列,但子序列的不是逐段分割的,每个子序列由相隔某个增量的元素组成,对各个子序列进行插入排序。然后将增量缩小,再次分割成一个个的子序列。。。,最后直到增量为1时,整个序列只有一个子序列,就是序列本身。

以序列12 17 30 50 20 60 65 4 19为例

第一次增量gap=N/2=4

序列分成4个子序列{12,20},{17,60},{30,65},{50,4},(分组没有改变元素原来的位置)分别进行插入排序后的序列为:

12 17 30 4 20 60 65 50 19

第二次增量为gap=gap/2=2

序列分成2个子序列{12,30,20,65},{17,4,60,50},排序后

12 4 20 17 30 50 65 60 19

第三次增量为gap=1

序列分成一个子序列{12,4 ,20 ,17 ,30, 50, 65 ,60, 19},排序后

4 12 17 19 20 30 50 60 65 

	//希尔排序,对长度为n的数组a排序
	static void shellSort()
	{
		for(int gap=n/2;gap>0;gap/=2)
		{
			for(int i=0;i<gap;i++)
			{//将原序列分成了gap组每组为:(i,gap+i,2*gap+i,...)
				for(int j=i+gap;j<n;j+=gap)
				{
					int k=j;
					int target=a[j];
					while(k>=gap && target<a[k-gap])
					{
						a[k]=a[k-gap];
						k=k-gap;
					}
					a[k]=target;
				}
			}
		}
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值