C语言希尔排序希尔排序.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言希尔排序希尔排序

希尔排序  希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。 基本思想   先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2d1重复上述的分组和排序,直至所取的增量dt=1(dtdt-l…d2d1),即所有记录放在同一组中进行直接插入排序为止。   该方法实质上是一种分组插入方法。   给定实例的shell排序的排序过程   假设待排序文件有10个记录,其关键字分别是:   49,38,65,97,76,13,27,49,55,04。   增量序列的取值依次为:   5,3,1   排序过程如【动画模拟演示】。   Shell排序的算法实现   1. 不设监视哨的算法描述   void ShellPass(SeqList R,int d)   {//希尔排序中的一趟排序,d为当前增量   for(i=d+1;i=n;i++) //将R[d+1..n]分别插入各组当前的有序区   if(R[ i ].keyR[i-d].key){   R[0]=R;j=i-d; //R[0]只是暂存单元,不是哨兵   do {//查找R的插入位置   R[j+d]=R[j]; //后移记录   j=j-d; //查找前一记录   }while(j0R[0].keyR[j].key);   R[j+d]=R[0]; //插入R到正确的位置上   } //endif   } //ShellPass   void ShellSort(SeqList R)   {   int increment=n; //增量初值,不妨设n0   do {   increment=increment/3+1; //求下一增量   ShellPass(R,increment); //一趟增量为increment的Shell插入排序   }while(increment1)   } //ShellSort   注意:   当增量d=1时,ShellPass和InsertSort基本一致,只是由于没有哨兵而在内循环中增加了一个循环判定条件j0,以防下标越界。   2.设监视哨的shell排序算法   具体算法【参考书目[12] 】   算法分析   1.增量序列的选择   Shell排序的执行时间依赖于增量序列。   好的增量序列的共同特征:   ① 最后一个增量必须为1;   ② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。   有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在nl.25到1.6n1.25之间。   2.Shell排序的时间性能优于直接插入排序   希尔排序的时间性能优于直接插入排序的原因:   ①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。   ②当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。   ③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。   因此,希尔排序在效率上较直接插人排序有较大的改进。   3.稳定性   希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化。   选择排序   选择排序的基本思想是:   对待排序的记录序列进行n-1遍的处理,第1遍处理是将L[1..n]中最小者与L[1]交换位置,第2遍处理是将L[2..n]中最小者与L[2]交换位置,......,第i遍处理是将L中最小者与L交换位置。这样,经过i遍处理之后,前i个记录的位置就已经按从小到大的顺序排列好了。   例1:输入序列数据按非减顺序输出.   程序如下:   program xzpx;   const n=7;   var a:array[1..n] of integer;   i,j,k,t:integer;   begin   write(Enter date:);   for i:= 1 to n do read(a);   writeln;   for i:=1 to n-1 do   begin   k:=i;   for j:=i+1 to n do   if a[j]a[k] then k:=j;   if ki then   begin t:=a;a:=a[k];a[k]:=t;end;   end;   write(output data:);   fo

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档