暑假信息学奥赛辅导教案.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
暑假信息学奥赛辅导教案

暑假信息学奥赛辅导教案 复习初中内容 (halt:退出程序。 exit:退出过程、函数。如果在主程序,则效果和halt一样。 break:跳出循环。 continue也是用在循环里面,但它并不是跳出,而是跳过这一次循环,直接进入下一个循环。) 一、分治算法: 例1:快速排序 (1)基本思想 在当前无序区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 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] 三趟排序之后 13 27 38 49 49[65]76 97 最后的排序结果 13 27 38 49 49 65 76 97 各趟排序之后的状态 快速排序算法 Const n=10; Var a:array [1..n] of integer; i,k:integer; procedure qsort(low,high:integer); var i,j:integer;x:integer; begin if lowhigh then begin i:=low;j:=high;x:=a[i]; repeat while (a[j]=x) and (ij)do j:=j-1; {把大于基准的数留在右面} if (a[j]x) and (ij) then begin a[i]:=a[j];i:=i+1;end; {把小于基准的数交换到左面} while (a[i]=x) and (ij) do i:=i+1; {把小于基准的数交换到左面} if (a[i]x) and (ij) then begin a[j]:=a[i];j:=j-1; end; {把大于基准的数交换到右面} until i=j; {直到I与j重叠,完成一次分组过程} a[i]:=x; {把基准数插入相应的位置,以后不再参与排序} qsort(low,i-1); {小于基准的数重复分组} qsort(i+1,high); {大于基准的数重复分组} end; end; begin for i:=1 to n do read(a[i]); qsort(1,n); for i:=1 to n do write(a[i]:6); writeln; end. 算法改进: procedure qsort(l,r:integer); var i,j,mid:integer; begin i:=l;j:=r; mid:=a[(l+r) div 2]; {将当前序列在中间位置的数定义为中间数} repeat while a[i]mid do inc(i); {在左半部分寻找比中间数大的数} while a[j]mid do dec(j); {在右半部分寻找比中间数小的数} if i=j then begin {若找到一组与排序目标不一致的数对则交换它们} swap(a[i],a[j]); inc(i);dec(j); {继续找} end; until ij; if lj then qsort(l,j); {若未到两个数的边界,则递归搜索左右区间} if ir then qsort(i,r); end;{sort} 从输出的数据可以发现,对较坏的初始数据如第一组输入数据,快速排序在交换数据的次数方面已给出了相当好的结果。时间的复杂性是O(nlog2n

文档评论(0)

精品文档 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档