求:添加监视哨的希尔排序(shellsort)算法

sxtymk 2006-10-25 08:41:48
如题,我知道shell算法,但不知怎样加监视哨,
听说黄刘生的《数据结构》上有,可是这里的图书馆里没有……
麻烦哪位指点一下,感激不尽!
...全文
265 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiorano 2006-10-30
  • 打赏
  • 举报
回复
清华的那本数据结构,排序的算法里很多都涉及到了监视哨
sxtymk 2006-10-30
  • 打赏
  • 举报
回复
多谢多谢,不过我需要消化一下,貌似少了点什么似的……
不过能找到已经很不错了,再次感谢!
idealguy 2006-10-25
  • 打赏
  • 举报
回复
找到一段,不只对否?

  (2)希尔排序
  希尔排序(Shell's methed)又称缩小增量排序(diminishing increment sort),它也是一种插入排序类的方法,但在时间效率上较前述几种排序方法有较大的改进。它是一种较快速的排序算法。其时间复杂度是O(n3/2)。
  希尔排序产生的原因是来自对直接插入排序的分析,当直接排序中其算法时间复杂度为O(n2) ,但是,若待排记录序列按关键字"基本有序",直接插入排序的效率就可大大提高。希尔排序就是主要针对这一点对直接插入排序进行改进而得到的。
  它的基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序。
  在希尔排序中,子序列的构成不是简单地"逐段分割",而是将相隔某个"增量"的记录组成一个子序列。如在第一趟排序时的增量为7,即将相隔为7的元素编成一组进行直接插入排序。第二趟排序时的增量为3,增量进一步缩小。由于在这两趟的插入排序中在子序列中逆序的关键字是跳跃式地移动,从而使得在进行最后一趟增量为1的插入排序时,序列已基本有序,只要作少量比较和移动即可完成排序,因此希尔排序的时间复杂度较直接插入排序低。
  下面用算法语言描述的希尔排序:
  希尔排序中增量序列的选取是一个复杂的问题,涉及到一些数学上尚未解决的难题。我们不想加以详细讨论。到目前仅得出部分结论:如当增量序列为d[k]=2t-k+l -1时,希尔排序的运行时间为O(n3/2),其中1≤k≤t≤└log2(n+1)┘。增量序列还可以有各种取法, 如d[k]=2t-k,(d=…,9,5,3,2,1)。但请注意:应使增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1。
  void shellpass(elem a[],int dh){
  //进行一趟希尔排序,dh为增量
  s=-dh+1; //监视哨位置
  for (i=dh;i<=n;i++) { //进行插入排序
  a[s]=a[i];
  j=i-dh;
  x=a[i].key;
  while (x0)
  s=-dh+1;
  }
  }   void shellsort(elem a[],int d[]){
  //希尔排序,d[k]为各趟排序增量序列,d[t]=1
  k=1;
  while (k<=t) {
  shellpass(a,d[k]);
  k++;
  }
  }

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧