Sorting Algorithm-Shell Sort

Shell Sort-希尔排序

Algorithm:

希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n^2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
将相距某个"增量"的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。
Ex:
49,38,65,97,76,13,27,49,55,04
第一次:步长为5
第一组:49,13
第二组:38,27   
第三组:65,49
第四组:97,55
第五组:76,04
对每组直接插入排序后    13,27,49,55,04,49,38,65,97,76

第二次:步长为2
第一组:13,27,49,55,04
第二组:49,38,65,97,76
对每组直接插入排序后    04,13,27,49,55,38,49,65,76,97

第三次:步长为1(最后步长必须是1)
最终结果: 04,13,27,38,49,49,55,65,76,97

Code:

void Shell_Sort(vector<int> &v)  //步长为n/2...依次
   {
	int gap =(v.size()/2);  //初始步长
	while (gap > 0)   //最后必为1
	{
		for (int i = gap; i < v.size(); i++)
		{
			int j = i-gap;
			int key = v[i];
			while (j>=0 && v[j]>key)
			{
				v[j+gap] = v[j];
				j = j - gap;
			}
			v[j+gap] = key;
		}
		gap /= 2;
	}	
   }

Analysis:

希尔排序的关键并不是随便分组后各自排序,而是将相隔某个"增量"的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。
这里的"增量"的选取就非常关键了,目前还是一个数学难题,迄今为止还没有人找到一种最好的增量序列。不过大量的研究表明,当增量序列为dlta[k]=2^(t-k+1)-1(0<=k<=[log2(n+1)])时,可以获得不错的效果,其时间复杂度为O(n^1.5),要好于直接排序O(n^2)。需要注意的是,增量序列的最后一个增量必须等于1。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法。
希尔算法的发明,使得我们终于突破了慢速排序的时代(超越了时间复杂度为O(n^2)),之后,相应的更为高效的排序算法也就相继出现了。
unstable sort




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值