排序(4)希尔排序

希尔排序又称为"缩小增量排序",是对插入排序的一种改进。

基本思想:设定一个元素间隔增量gap,将参加排序的序列按这个间隔数gap从第一个元素开始依次分成若干个子序列。在子序列中再用其他排序方法,然后缩小增量gap,重新将整个序列按照新的间隔数gap进行划分,再分别对每个子序列进行排序。如此将“缩小增量gap——划分序列——将每个子序列排序”的操作进行下去,直到间隔数增量gap=1为止。


一般情况下,当增量gap缩小到1时,序列几乎都已经按值有序,不需要进行较多的元素移动就能达到排序的目的。


如何选取gap值? 常用且效果很好的gap值取法:首先gap取值为序列长度的一半。而在后续的排序过程中,后一趟排序的gap取值为前一趟排序gap取值的一半即可。


算法描述:

void shellsort(keytype k[],int n) {
	int i,j,flag,gap=n;
	keytype tmp;
	while(gap>1) {
		gap =gap/2;
		do {
			flag=0;
			for(i=1;i<=n-gap;i++) {
				j=j+gap;
				if(k[i]>k[j]) {
					tmp = k[i];
					k[i]=k[j];
					k[j]=tmp;
					flag=1;
				}
			}
		}while(flag!=0);
	}
}


参考 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值