初学者提高篇二.docVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Procedure Sift(Var R :FileType; I, M : Integer); //在数组R[I..M]中调用R[I],使得以它为完全二叉树构成堆。事先已知其左、右子树(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指向关键字较大的右孩子// ????????//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;//将最初被调整的结点放入正确位置// 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;//将当前堆顶记录和堆中最后一个记录交换//     Sift(R, 1, I-1) //将R[1..I-1]重成堆//    end  End; //HeapSort// 六、几种排序算法的比较和选择 1. 选取排序方法需要考虑的因素: (1) 待排序的元素数目n; (2) 元素本身信息量的大小; (3) 关键字的结构及其分布情况; (4) 语言工具的条件,辅助空间的大小等。 2. 小结: (1) 若n较小(n = 50),则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。 (2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。 (3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序是目前基于比较的内部排序法中被认为是最好的方法。 (4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于比较的排序算法,至少需要O(nlog2n)的时间。 (5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。 ? 分治策略 相关知识: 一维数组 | 多维数组 | 栈 | 队列 | 串 | 回溯 一、算法思想   任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题规模越小,解题所需的计算时间往往也越少,从而也越容易计算。想解决一个较大的问题,有时是相当困难的。分治法的思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。   分治的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。找出各部分的解,然后把各部分的解组合成整个问题的解。   1、解决算法实现的同时,需要估算算法实现所需时间。分治算法时间是这样确定的:       解决子问题所需的工作总量(由 子问题的个数、解决每个子问题的工作量 决定)   合并所有子问题所需的工作量   2、分治法是把任意大小问题尽可能地等分成两个子问题的递归算法   3、分治的具体过程:    begin  {开始}     if ①问题不可分 then ②返回问题解        else begin          ③从原问题中划出含一半运算对象的子问题1;          ④递归调用分治法过程,求出解1;          ⑤从原问题中划出含另一半运算对象的子问题2;          ⑥递归调用分治法过程,求出解2;          ⑦将解1、解2组合成整修问题的解;          end;    end; {结束} 二、例题分析    1、[金块问题]老板

文档评论(0)

word.ppt文档 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档