ImageVerifierCode 换一换
格式:DOC , 页数:8 ,大小:41KB ,
资源ID:8736892      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8736892.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(信息学奥赛——排序算法.doc)为本站上传会员【s4****5z】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

信息学奥赛——排序算法.doc

1、全国青少年信息学奥林匹克联赛 排序算法 Ø 一、插入排序(Insertion Sort) 1. 基本思想:      每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。 2. 排序过程:  【示例】: [初始关键字] [49] 38 65 97 76 13 27 49     J=2(38) [38 49] 65 97 76 13 27 49     J=3(65) [38 49 65] 97 76 13 27 49     J=4(97) [38 49 65 97] 76 13 27 49    

2、 J=5(76) [38 49 65 76 97] 13 27 49     J=6(13) [13 38 49 65 76 97] 27 49     J=7(27) [13 27 38 49 65 76 97] 49     J=8(49) [13 27 38 49 49 65 76 97] Procedure InsertSort(Var R : FileType); //对R[1..N]按递增序进行插入排序, R[0]是监视哨//   Begin     for I := 2 To N Do      //依次插入R[2],...,R[n]//     begin

3、      R[0] := R[I]; J := I - 1;       While R[0] < R[J] Do   //查找R[I]的插入位置//        begin         R[J+1] := R[J];       //将大于R[I]的元素后移//         J := J - 1        end       R[J + 1] := R[0] ;      //插入R[I] //     end   End;                  //InsertSort //   二、选择排序 1. 基本思想:   每一趟从待排序的数据元

4、素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 2. 排序过程: 【示例】:   初始关键字 [49 38 65 97 76 13 27 49] 第一趟排序后 13 [38 65 97 76 49 27 49] 第二趟排序后 13 27 [65 97 76 49 38 49] 第三趟排序后 13 27 38 [97 76 49 65 49] 第四趟排序后 13 27 38 49 [49 97 65 76] 第五趟排序后 13 27 38 49 49 [97 97 76] 第六趟排序后 13 27 38 49 49 76 [76

5、97] 第七趟排序后 13 27 38 49 49 76 76 [ 97] 最后排序结果 13 27 38 49 49 76 76 97 Procedure SelectSort(Var R : FileType);      //对R[1..N]进行直接选择排序 //   Begin     for I := 1 To N - 1 Do                  //做N - 1趟选择排序//      begin       K := I;       For J := I + 1 To N Do                //在当前无序区R[I..N]中选最小

6、的元素R[K]//        begin         If R[J] < R[K] Then K := J        end;       If K <> I Then                      //交换R[I]和R[K] //         begin Temp := R[I]; R[I] := R[K]; R[K] := Temp; end;      end   End.                               //SelectSort //   三、冒泡排序(BubbleSort) 1. 基本思想:   两两比较待

7、排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。 2. 排序过程:   设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。 【示例】: 49 13 13 13 13 13 13 13 38 49 27 27 27 27 27 27 65 38 49 38 38 38 38 38 97 65 38 49 49 49 49 49 76 97 65 49 49

8、 49 49 49 13 76 97 65 65 65 65 65 27 27 76 97 76 76 76 76 49 49 49 76 97 97 97 97 Procedure BubbleSort(Var R : FileType) //从下往上扫描的起泡排序// Begin   For I := 1 To N-1 Do   //做N-1趟排序//    begin      NoSwap := True;    //置未排序的标志//      For J := N - 1 DownTo 1 Do    //从底部往上扫描//       begin     

9、   If R[J+1]< R[J] Then    //交换元素//         begin          Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp;          NoSwap := False         end;       end;      If NoSwap Then Return    //本趟排序中未发生交换,则终止算法//     end End.                      //BubbleSort// 四、快速排序(Quick Sort) 1. 基本思想:   在当前无

10、序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。 2. 排序过程: 【示例】: 初始关键字 [49 38 65 97 76 13 27 49] 第一次交换后 [27 38

11、 65 97 76 13 49 49] 第二次交换后 [27 38 49 97 76 13 65 49] J向左扫描,位置不变,第三次交换后 [27 38 13 97 76 49 65 49] I向右扫描,位置不变,第四次交换后 [27 38 13 49 76 97 65 49] J向左扫描 [27 38 13 49 76 97 65 49] (一次划分过程) 初始关键字 [49 38 65 97 76 13 27 49] 一趟排序之后 [27 38 13] 49 [76 97 65 49] 二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]

12、 三趟排序之后 13 27 38 49 49 [65]76 97 最后的排序结果 13 27 38 49 49 65 76 97 各趟排序之后的状态 Procedure Parttion(Var R : FileType; L, H : Integer; Var I : Integer); //对无序区R[1,H]做划分,I给以出本次划分后已被定位的基准元素的位置 // Begin   I := 1; J := H; X := R[I] ;   //初始化,X为基准//   Repeat     While (R[J] >= X) And (I < J) Do       

13、begin        J := J - 1        //从右向左扫描,查找第1个小于 X的元素//        If I < J Then     //已找到R[J] 〈X//          begin           R[I] := R[J];   //相当于交换R[I]和R[J]//           I := I + 1          end;        While (R[I] <= X) And (I < J) Do           I := I + 1      //从左向右扫描,查找第1个大于 X的元素///       end;

14、      If I < J Then    //已找到R[I] > X //        begin         R[J] := R[I];     //相当于交换R[I]和R[J]//         J := J - 1        end   Until I = J;   R[I] := X       //基准X已被最终定位// End;           //Parttion // Procedure QuickSort(Var R :FileType; S,T: Integer); //对R[S..T]快速排序// Begin   If S < T

15、Then    //当R[S..T]为空或只有一个元素是无需排序//     begin       Partion(R, S, T, I);    //对R[S..T]做划分//       QuickSort(R, S, I-1);  //递归处理左区间R[S,I-1]//       QuickSort(R, I+1,T);  //递归处理右区间R[I+1..T] //     end; End.                  //QuickSort//   五、堆排序(Heap Sort) 1. 基本思想:      堆排序是一树形选择排序,在排序过程中,将R[

16、1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 2. 堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:        Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])      堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子

17、的关键字,则称之为大根堆。 3. 排序过程:     堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。 【示例】:对关键字序列42,13,91,23,24,16,05,88建堆 Procedure Sift(Var R :FileType; I, M : Integer); //在数组R[I..M]中调用R[I],使得以它

18、为完全二叉树构成堆。事先已知其左、右子树(2I+1 <=M时)均是堆// Begin   X := R[I]; J := 2*I;            //若J <=M, R[J]是R[I]的左孩子//   While J <= M Do            //若当前被调整结点R[I]有左孩子R[J]//    begin     If (J < M) And R[J].Key < R[J+1].Key Then       J := J + 1                 //令J指向关键字较大的右孩子//                              

19、  //J指向R[I]的左、右孩子中关键字较大者//     If X.Key < R[J].Key Then     //孩子结点关键字较大//       begin         R[I] := R[J];              //将R[J]换到双亲位置上//         I := J ; J := 2*I            //继续以R[J]为当前被调整结点往下层调整//       end;      Else       Exit                  //调整完毕,退出循环//    end   R[I] := X;         

20、      //将最初被调整的结点放入正确位置// End;//Sift// Procedure HeapSort(Var R : FileType);        //对R[1..N]进行堆排序//  Begin   For I := N Div Downto 1 Do               //建立初始堆//    Sift(R, I , N)   For I := N Downto 2 do                  //进行N-1趟排序//    begin     T := R[1]; R[1] := R[I]; R[I] := T;     //将当

21、前堆顶记录和堆中最后一个记录交换//     Sift(R, 1, I-1)                 //将R[1..I-1]重成堆//    end  End;                 //HeapSort//   六、几种排序算法的比较和选择 1. 选取排序方法需要考虑的因素: (1) 待排序的元素数目n; (2) 元素本身信息量的大小; (3) 关键字的结构及其分布情况; (4) 语言工具的条件,辅助空间的大小等。 2. 小结: (1) 若n较小(n <= 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择

22、排序多,因而当记录本身信息量较大时,用直接选择排序较好。 (2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。 (3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序法中被认为是最好的方法。 (4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。 (5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服