您的位置:首页 > 其它

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

2012-10-17 16:05 155 查看
 由希尔在1959年提出,又称希尔排序(shell排序)。


原理

  已知一组无序数据a[1]、a[2]、……a
,需将其按升序排列。发现当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值减小时每一趟需要和动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐