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

sxtymk 2006-10-25 08:41:48
如题,我知道shell算法,但不知怎样加监视哨,
听说黄刘生的《数据结构》上有,可是这里的图书馆里没有……
麻烦哪位指点一下,感激不尽!
...全文
281 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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++;
  }
  }
内部排序合集(插入、希尔、起泡、快速、选择、堆、归并和基数排序) 这是我在我们期末的时候写的一些内部排序的例子。因为我们的数据结构考试的范围就限定在内部排序上,所以我没有什么办法,只好对自己埋头苦干就行内部排序的编程了。有些内部排序的例子很是好理解,我们可以通过一些图示来很好地了解到这些排序的过程,但是这些程序的代码可能不是那么好写。而另外一些程序的思想既难以理解,也难于编码。着实地伤透了我的脑筋。下面就将我的程序的主框架代码展示给大家看看。注意,在这里我怎样也不好实现2-路插入排序,因为它这样的排序方法运用在顺序存储结构下不好,在判断数组越界的时候这样的复杂性使我最终放弃了这种方法。要不还不如使用其余的排序呢。 毕竟了解内部排序是一件好事,以后在看一些内部排序的时候也不至于摸不着头脑。最近我看到了一本有关介绍用C++来编辑游戏的书,它就以STL为例,讲解了STL内部实现的机理。 // 头文件 #include using namespace std; #include "InsertionSort.h" #include "Shell'sSort.h" #include "QuickSort.h" #include "SelectionSort.h" #include "MergingSort.h" #include "RadixSort.h" // 定义的宏 #define LENGTH 10 // 主函数 int main( int argc, char** argv ) { // 定义一个顺序表 SqList a; int objArray[LENGTH] = { 278, 109, 63, 930, 589, 184, 505, 269, 8, 83 }; a.length = LENGTH; int i; for ( i = 1; i < a.length + 1; i++ )// 需要将0号位设为监视哨 { a.r[i].key = objArray[i-1]; a.r[i].otherinfo = '\0'; } // 直接插入排序 //InsertSort( a ); // 折半插入排序 //BInsertSort( a ); // 2-路插入排序 //BinRouteInsertSort( a, 2 );// 这个算法有问题 // 希尔排序 /* { int dlta2[3] = { 3, 2, 1 }; ShellSort( a, dlta2, 3 ); } */ // 起泡排序 //BubbleSort( a ); // 快速排序 //QuickSort( a, 1, LENGTH ); // 选择排序 //SelectSort( a ); // 堆排序 //HeapSort( a ); // 归并排序 //MergeSort( a ); // 基数排序 { SLList b; int i; b.keynum = 3, b.recnum = LENGTH;// 对3位整数进行基数排序 for ( i = 1; i <= b.recnum; i++ ) { b.r[i].keys[0] = objArray[i-1] % 10;// 个位 b.r[i].keys[1] = objArray[i-1] % 100 / 10;// 十位 b.r[i].keys[2] = objArray[i-1] / 100;// 百位 } RadixSort( b ); } // 显示排序后的数组 for ( i = 1; i < a.length + 1; i++ )// 需要将0号位设为监视哨 cout<算法都是C风格的,可以直接使用。) 我最新的动态:最近在研究DirectInput,希望能够在几天后写一篇技术文章,分享一些我的经验。

33,027

社区成员

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

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