排序算法总结之希尔排序

希尔排序是按照不同步长对元素进行插入排序,实质就是把一组元素分为很多小组各自进行排序。

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列,分别进行直接插入排序,然后元素的分隔逐渐减少,当增量足够小(即为1时),再对全体元素进行一次插入排序,因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序时间效率比较高。

这里用下别人的图

以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                                        1B

        2A                                         2B

                 3A                                         3B

                         4A                                          4B

                                  5A                                         5B

这里就分了5组,每组都进行一次插入排序,完成之后,改变间距

第二次 gap = 5 / 2 = 2

排序后

13   27   49   55   4    49   38   65   97   26

1A             1B             1C              1D            1E

        2A               2B             2C             2D              2E

如图分为两组,再次进行插入排序,然后继续减小间距,知道间距为1,所以希尔排序就是把直接插入排序用了多回的算法 ,代码如下

void ShellSort(int a[],int N)//N是待排元素个数
{
	int tmp,i;
	for(int gap=N/2;gap>0;gap/=2)//希尔排序增量
		for(int j=gap;j<N;j++)//各组元素交替插入排序
	       {	tmp=a[j];
                for(i=j;i>=gap&&a[i-gap]>tmp;i-=gap)
					a[i]=a[i-gap];
				a[i]=tmp;
	}

}
希尔排序平均时间复杂度为O(n(1.3)),最好是O(n),最坏情况O(n(2)),并且是不稳定的



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值