查找与排序技术(new)简介.ppt

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

调整建堆 输入:完全二叉树数组H(1:n)。其中结点H(m)的左右子树均为堆。 输出:以H(m)为根结点的子树为堆。 PROCEDURE SIFT(H,n,m) t=H(m); j=2m WHILE (j≤n) DO { IF (j<n)and(H(j)<H(j+1)) THEN j=j+1 IF (t<H(j)) THEN { H(m)=H(j); m=j; j=2m } else j=n+1 } H(m)=t RETURN (1)首先将一个无序序列建成堆。 (2)然后将堆顶元素(序列中的最大项)与堆中最后 一个元素交换(最大项应该在序列的最后)。 不考虑已经换到最后的那个元素,只考虑前 n-1个元素构成的子序列,显然,该子序列已 不是堆,但左、右子树仍为堆,可以将该子序列 调整为堆。 反复做第(2)步,直到剩下的子序列为空为止。 堆排序 输入:无序序列H(1:n)。 输出:无序序列H(1:n)。 PROCEDURE HEAPSORT(H,n) k=n/2 FOR i=k TO 1 BY -1 DO SIFT(H,n,i) [无序序列建堆] FOR i=n TO 2 BY -1 DO {t=H(1);H(1)=H(i);H(i)=t[堆顶元素换到最后] SIFT(H,i-1,1) [调整建堆] } RETURN heapsort(p,n) int n; ET p[]; { int i,k; ET t; k=n/2; for (i=k-1; i>=0; i--) sift(p,n-1,i); /*无序序列建堆*/ for (i=n-1; i>=1; i--) { t=p[0]; p[0]=p[i]; p[i]=t; /*堆顶元素换到最后*/ sift(p,i-1,0); /*调整建堆*/ } return; } static sift(h,n,m) int n,m; ET h[]; { int j; ET t; t=h[m]; j=2*(m+1)-1; while (j<=n) { if ((j<n)(h[j]<h[j+1])) j=j+1; if (t<h[j]) { h[m]=h[j]; m=j; j=2*(m+1)-1;} else j=n+1; } h[m]=t; return; } 3.2.4 其他排序方法简介 1. 归并排序 设线性表L(1:n)中的某段L(low:high)已经部分有序,即它的两个子表L(low:mid)与L(mid+1:high)(其中low≤mid≤high)已经有序,现要将这两个有序子表归并成一个有序子表L(low:high)。 实现上述两个子表归并的基本做法如下: (1)开辟一个与线性表L同样大小的表空间A。 (2)设置三个指针i,j,k,其初始状态分别指向两个有序子 表的首部及表空间A中与L中需要进行排序段相对应空间 的首部。即i=low,j=mid+1,k=low。 (3)沿两个有序子表扫描: 若L(i)≤L(j),则A(k)=L(i),且i与k指针均加1; 否则A(k)=L(j),且j与k指针均加1。 如此反复,直到有一个子表的指针已经指到末端(即子 表内的元素已经取空)为止。 (4)将未取空的子表中的剩余元素依次放入表空间A中。 (5)将A中的对应段复制到L中。 两个相邻有序子表的合并 输入:两个相邻有序子表L(low:mid)与L(mid+1:high) (其中low≤mid≤high);工作数组A(low:high)。 输出:有序子表L(low:high)。 PROCEDURE MERGE(L,low,mid,high,A) i=low,j=mid+1,k=low WHILE (i≤mid)and(j≤high) DO { IF L(i)≤L(j) THEN { A(k)=L(i);i=i+1 } ELSE { A(k)=L(j);j=j+1 } k=k+1 } IF (i≤mid) THEN {FOR j=i TO mid DO { A(k)=L(j);k=k+1 } ELSE { IF (j≤high) THEN FOR i=j TO high D

文档评论(0)

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

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

1亿VIP精品文档

相关文档