排序算法之希尔排序

原理:

希尔排序算法是直接插入排序算法演变而来的一个算法,其原理是在直接插入排序的基础上增加了一个跨度。
(直接插入排序:http://blog.csdn.net/elijah_wong/article/details/56287491)

举例:

例如我们让首次跨度为5。
2,12,5,57,31,31,90,32,95,76
第一次完整的比较2和31,12和90,5和32,57和95,31和76.因为前面的数字都小于后面比较的数字,所以第一次比较后没有改变。
然后我们减小跨度为2。
2,12,5,57,31,31,90,32,95,76
第二次完整的比较2和5和31和90和95,12和57和31和32和76。于是生成了一下的数据。
2,12,5,31,31,32,90,57,95,76

然后我们减小跨度为1。
当跨度为1的时候执行的就和直接插入排序的一致了。生成排序好的数据。

2,5,12,31,31,32,57,76,90,95

代码:

void ShellSort(int a[], int nlen)
{
	int temp, j;
	int gap = nlen;
	do
	{
		gap = gap / 2;
		for (int i = gap; i != nlen; ++i)
		{
			if (a[i - gap] > a[i])
			{
				temp = a[i];
				for (j = i - gap; a[j] > temp; j-=gap)
				{
					a[j + gap] = a[j];
				}
				a[j + gap] = temp;
			}
		}
	} while (gap > 1);
}

总结:

我们可以从代码的角度上看出希尔排序只是简单的从直接插入排序上面增加了一个跨度,跨度逐渐递减。当待排序的数据相对有序(小数在前或大数在前)的情况下,希尔排序的效果最好。但由于元素的个数及其顺序和间隔的设定。其时间复杂度显得不是很稳定。平均下来应该在O(nlog2n) ~ O(n^2)之间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值