【排序算法(二)】希尔排序

希尔排序

将待排序的记录分割成子序列,整体序列是基本有序的,再在这些子序列中进行直接插入排序。
所谓基本有序,就是小的关键字基本在前面,大的基本在后面。
如何将记录分割成子序列:跳跃分割的策略。将相距某个增量的记录组成一个子序列。

希尔排序是基于直接插入排序的以下两点性质而提出的改进方法:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
2.插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

希尔排序是将待排序的数组元素 按下标的一定增量分组
,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。

作者:Promise_Sun 链接:https://www.jianshu.com/p/d730ae586cf3 来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

示例代码:和直接插入排序的区别在于increment增量的设计

void ShellSort(SqList *L){
	int i,j;
	int increment = L->length;
	do {
		increment = increment/3+1;/*增量序列*/
		for(i=increment+1;i<L->length;i++){
			if(L->[i]<L->[i-increment]){
				L->[0] = L->[i];
				for(j=i-increment;j>0&&L->[j]>L->[0];j-=increment){
					L->[j+increment] = L->[j];
				}
				L->[j+increment] = L->[0];
			}
		}
	}
	while(increment>1);
}

增量序列的选择很关键。增量序列的最后一个值必须是1,才能遍历所有的元素。希尔排序不是稳定的,时间复杂度可以达到O(n^3/2)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值