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