希尔排序 以及c的实现函数

 由希尔在1959年提出,又称 希尔排序 (shell排序)。

原理

  已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n不大时,插入排序的效果很好。首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1。


C程序

  k=n/2;
  while(k>0)
  {
  for(i=k;i<=n;i++)
  {
  t=a[i];
  j=i-k;
  while(j>=1 && t<a[j])
  {
  a[j+k]=a[j];
  j=j-k;
  }
  a[j+k]=t;
  }
  k/=2;
  }

优劣

  优点:快,数据移动少;
  缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。
  不需要大量的辅助空间,和 归并排序 一样容易实现。 希尔排序 是基于 插入排序 的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的 时间复杂度 为 O(N*(logN)2), 没有 快速排序算法 快 O(N*(logN)),因此中等大小规模表现良好,对规模非常大的 数据排序 不是 最优选择。但是比O(N2)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时 快速排序 在最坏 的情况下执行的效率会非常差。 专家门提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快, 再改成快速排序这样更高级的排序算法. 本质上讲, 希尔排序算法 的一种改进,减少了其复制的次数,速度要快很多。 原因是,当N值很大时 数据项 每一趟排序需要的个数很少,但数据项的距离很长。 当N值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值