C++希尔排序

本文详细介绍了希尔排序的基本原理和实现过程,通过逐步减少间隔的方式对数组进行排序,有效地提高了排序效率。

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

希尔排序的思想较为巧妙,它的思想:将要排序的文件分为n个组,距离为s的分为一组,再将这一组进行排序,完成这个操作之后,再将s的值变小继续排序直到距离为零时

  1. 下图进行第一次排序:首先要知道一个距离的值,这个值可以设为数组长度的一半(超过的话第一次排序不能将所有的数值都排序一次),在本案例中为4,初始值可以设为从下标为4的元素开始,这样正好可以使这个数组从下标为0的位置比较,元素都可以进行排序一遍
  2. 第一遍时,距离较大,每组所记录数较少,所以速度较快。后面的几次排序时,距离就会缩小,缩小的原则为除以2,在第二次排序时,明显每组的记录数就变多了,但是由于在第一遍排序的基础上,排序的速度并不会慢
    在这里插入图片描述
  3. 在排序的过程中:还是以上图为例子,在下标为7的元素再进行排序时,他首先与下标为i=7-4的数比较,前者是小于后者的(在此为升序),所以要将这个较大的数放在这个数的下标加距离位置(也就是下标为7的位置),那么当前的这个元素还要继续比较,他与7-4这个位置再减4(即i-4=-1)的位置比较,结果这个位置不存在,那么本次的比较结束,且当前下标的值插入在i+4的位置
    在这里插入图片描述
  4. 当距离为1时已经可以将所有的元素都排序一遍,且由于前面的排序使得后面的排序变得快速

代码如下:

shellSort(int arr[],int len,int n){
	//len为arr的长度,n为希尔排序的分组间隔
	int i,j,temp,k;
	for(i=n;i>0;i>>=1){
		for(j=i;j<len;j++){
			temp = arr[j];
			k = j-i;
			while(k >= 0 && temp < arr[k]){
				arr[k + i] = arr[k];
				k-=i;
			}
			arr[k+i] = temp;
		}
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值