C语言实现希尔排序

像选择排序、插入排序、冒泡排序都是刚开始接触排序时,接触比较多的排序算法,希尔排序往往在学习了以上几种排序算法后再进行学习,当然,这也是因为希尔排序的实现是基于插入排序来实现的。首先我们要确定一个间隔数gap,然后分别从要排序序列的第0~gap-1个数开始,每隔gap个数划分为一组。(如对于整型数组{3,6,8,2,7,5},当取gap值为2时,则划分为{3,2}、{6,7}、{8,5}三组数)随后,让减小gap的值,再次排序,直到gap为1,进行最后一次的排序,而此时的排序其实就是直接插入排序。对于间隔数gap的确定,影响着希尔排序的算法效率,一个理想的间隔数也许无法直接得到,对于算法实现而言,我们取间隔数为N/2,即每次变为原来的1/2。

实现的代码如下:

int ShellSort(int arr[], int l, int r)
{
	int len = r - l + 1;// 计算数组长度
	for (int gap = len/2; gap > 0; gap /= 2)  //外围循环,使gap递降为1
	{
		for (int j = l; j < l+gap; j++) //对于每个gap,j代表分割后的每组头元素
		{
			for (int k = j+gap; k <= r; k += gap)//每组从头元素开始,以gap为距,作插入排序
			{
				int temIndex = k; //记录当前下标,并依次向前比较、插入
				while (arr[temIndex] < arr[temIndex-gap])
				{
					Swap(arr[temIndex], arr[temIndex - gap]);//当前值更小,向前插入
					temIndex -= gap;//继续向前寻找
				}
			}
		}
	}

	return 1;
}
通过上面代码,就实现了一个标准的希尔排序。
需要说明的是,目前我们无法准确评价不同的间隔数的选择,对于算法效率的有什么样的影响。事实上,由于希尔算法的特殊性,我们甚至很难从理论上比较希尔算法和其他排序算法,参考一些文献得知,希尔排序的算法效率与N(logN)^2以及N^1.25较为接近。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值