高考专题复习专题七 排序算法的程序实现信息技术.docx
- 文档编号:30351690
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:45
- 大小:201KB
高考专题复习专题七 排序算法的程序实现信息技术.docx
《高考专题复习专题七 排序算法的程序实现信息技术.docx》由会员分享,可在线阅读,更多相关《高考专题复习专题七 排序算法的程序实现信息技术.docx(45页珍藏版)》请在冰豆网上搜索。
高考专题复习专题七排序算法的程序实现信息技术
专题七 排序算法的程序实现
【考纲标准】
考试内容
考试要求
排序算法的程序实现:
①冒泡排序
②选择排序
c
1.(2018·4月浙江选考)有一组正整数,要求仅对其中的素数进行升序排序。
排序后素数在前,非素数在后。
排序示例如下。
排序前
86
71
5
41
81
79
37
89
排序后
5
37
41
71
79
89
86
81
实现上述功能的VB程序如下,但加框处代码有误,请改正。
Constn=8
Dima(1Ton)AsInteger
PrivateSubCommand1_Click()
DimiAsInteger,jAsInteger,kAsInteger,tAsInteger
DimflagAsBoolean
′读取一组正整数,存储在数组a中,代码略
Fori=1Ton-1
′
(1)
IfIsPrime(a(k))Thenflag=TrueElseflag=False
Forj=i+1Ton
IfIsPime(a(j))Then
If
Then ′
(2)
k=j
flag=True
EndIf
EndIf
Nextj
Ifk<>iThen
t=a(k):
a(k)=a(i):
a(i)=t
EndIf
IfNotflagThenExitFor ′ExitFor表示退出循环
Nexti
′依次输出排序后的数据。
代码略
EndSub
FunctionIsPrime(mAsInteger)AsBoolean
′本函数判断m是否是素数:
是素数返回值为True,不是素数返回值为False
′代码略
EndFunction
解析 交换两个数的语句出现在外循环中,说明是选择排序,变量k表示每趟排序中的最值,因此k的初值是i。
题目是要求仅对其中的素数进行升序排序,因此比较的对象a(k)还要求是素数。
答案
(1)k=i
(2)NotflagOra(j) 或NotIsPrime(a(k))Ora(j) 或NotflagOrflagAnda(j) 或NotIsPrime(a(k))OrIsPrime(a(k))Anda(j) 2.(2017·11月浙江选考)小李基于冒泡排序算法编写一个VB程序,功能如下: 在文本框Text1中显示排序前的数据,单击“排序”按钮Command1,在文本框Text2中显示剔除重复数据后的升序排序结果。 程序运行界面如下图所示。 实现上述功能的VB代码如下,但加框处代码有错,请改正。 Constn=10 Dima(1Ton)AsInteger PrivateSubCommand1_Click() DimiAsInteger,jAsInteger,tAsInteger DimbottomAsInteger ′剔除重复数据后元素的个数 ′获取排序前数据依次存储在数组a中,并在文本框Text1中显示。 代码略 bottom=n i=1 DoWhilei<=bottom-1 Forj=bottomToi+1Step-1 If Then ′ (1) t=a(j): a(j)=a(j-1): a(j-1)=t ElseIfa(j)=a(j-1)Then′若相邻数据相等,进行剔除处理 ′ (2) bottom=bottom-1 EndIf Nextj i=i+1 Loop Text2.Text="" Fori=1Tobottom Text2.Text=Text2.Text+Str(a(i)) Nexti EndSub 解析 本题考核从后往前冒泡的算法思想。 从后往前冒泡,前面的数据先有序,当两次比较的数据a(j-1)和a(j)中相等时,a(j-1)可能已经有序,因此用最后一个数据替换a(j),同时数据的有效长度bottom少1个。 答案 (1)a(j)a(j) 或其他等价表达式 (2)a(j)=a(bottom) 或其他等价语句 3.(2016·10月浙江省技术选考)小吴为了研究冒泡排序过程中数据的“移动”情况,编写了一个VB程序,功能如下: 在列表框List1中显示排序前数据(存储在数组a中),在文本框Text1中输入初始位置(即下标值),单击“排序”按钮Command1后,在标签Label1中显示指定初始位置的数据在排序过程中的位置变化情况,排序后的数据显示在列表框List2中。 程序运行界面如图所示。 实现上述功能的VB程序如下,但加框处代码有错,请改正。 Dima(1To8)AsInteger DimnAsInteger PrivateSubForm_Load() a (1)=30: a (2)=47: a(3)=30: a(4)=72 a(5)=70: a(6)=23: a(7)=99: a(8)=24 n=8 Fori=1To8 List1.AddItema(i) Nexti EndSub PrivateSubCommand1_Click() DimiAsInteger,jAsInteger,kAsInteger DimposAsInteger DimsAsString s=Text1.Text pos=Val(Text1.Text) Fori=1Ton-1 Forj=nToi+1Step-1 Ifa(j) ′ (1) a(j-1)=a(j) a(j)=k ′如果pos位置的数据参与交换,则更新pos值,记录pos变化位置 Ifpos=jThen pos=j-1 s=s+”→”+Str(pos) ′ (2) pos=j s=s+”→”+Str(pos) EndIf EndIf Nextj Nexti Label1.Caption=“位置变化情况: ”+s Fori=1Ton List2.AddItemStr(a(i)) Nexti EndSub 解析 第一处改错实现的是两个变量的交换。 交换变量a(j)和a(j-1)的值后,该两个元素数据位置发生变化,接下来判断这两个元素的下标是否和pos相同,如果pos和j相同,已经被交换到j-1位置,pos需要更新,否则如果pos和j-1相同,已经被交换到j位置,pos需要更新。 答案 (1)k=a(j-1) (2)ElseIfpos=j-1Then 1.排序的作用是把n个数据从小到大或从大到小重新排列,使得a (1)至a(n)中的数据有序。 排序的方法有很多,重点掌握冒泡排序和选择排序。 2.n个数据一般需要经过n-1趟排序,变量i控制排序的趟数。 第i趟的比较次数往往有n-i次。 3.变量j表示比较大小的元素位置,其中数组元素a(j-1)表示第j-1个位置的数组元素,他位于a(j)的前面第一个元素,a(j+1)位于a(j)的后面第一个元素。 4.内部循环(j的循环)初值和终值决定了排序的区间和方向。 如果初值大于终值,初值往往是n,表示从后往前向后排序,若j的初值小于终值,初值往往是1,表示从前往后排序。 考点1 从后往前冒泡排序 1.以n(n=5)个元素从后往前冒泡升序排序为例,完成下列表格。 趟数 排序区间 第1次 第2次 第3次 第4次 j终值 比较次数 有序区间 j j-1 j j-1 j j-1 j j-1 i=1 [1,n] 5 4 4 3 3 2 2 1 2 4 [1,1] i=2 [2,n] 5 4 4 3 3 2 3 3 [1,2] i=3 [3,n] 5 4 4 3 4 2 [1,3] i=4 [4,n] 5 4 5 1 [1,4] ①第i趟冒泡,把最大或最小的元素交换到第i位置,实现从第1个位置到第i个位置的元素有序。 数组前面的元素先有序。 ②第i趟排序的区间是[i,n],因此每趟排序的比较的位置(j的初值)为n。 2.每趟排序的算法 第i趟的排序实现在区间[i,n]中,从第n个位置的数开始,依次与前面相邻的数比较,如果逆序即交换,比较和交换的对象为a(j)和a(j-1),比较完后向前移动,直到j-1的位置到达最前面的位置i为止,此时j=i+1。 实现区间[1,i]的数据有序。 3.若每趟交换的次数为0,表示所有数据均有序,可以提前结束排序算法。 也可以记flag的状态为False,若发生交换,将flag的值修改为True,根据flag的值,也可以表示数据是否有序。 4.每趟排序实现了[1,i]之间的数据有序,因此下趟排序的区间为[i+1,n]。 记录第i趟排序最后一次交换的位置j,此时表示[1,j-1]已经有序,下趟排序的区间可以修改为[j,n],当j大于i+1时,就缩小下趟排序的区间,减少排序的次数,达到优化排序的效果。 5.核心代码 【例1】小刘在研究n个数的冒泡排序算法时,发现可以从两个方面进行优化: (1)在每遍冒泡过程中,若最后一次交换的是last与last-1位置的数,则last-1位置之前的相邻数据均已有序。 进行下一遍冒泡时,无序区域设置为[last,n]。 (2)若在某一遍排序中没有数据交换,说明待排序数据都已经有序,冒泡排序过程可在此遍排序后终止。 小刘按上述方法编写的冒泡优化VB程序,功能如下: 程序运行时生成100个随机整数存入数组a,并显示在列表框List1中。 单击“排序”按钮Command1后,对数组a中的数据进行排序,排序后的数据显示在列表框List2中,排序过程中实际的冒泡遍数显示在标签Label3上。 程序运行界面如图所示。 实现上述功能的VB程序如下,但加框处代码有错,请改正。 Dima(1To100)AsInteger PrivateSubForm_Load() ′产生100个无重复的三随机整数,存入数组a并显示在列表框list1中 ′代码略 EndSub PrivateSubCommand1_Click() DimflagAsBoolean,iAsInteger,jAsInteger DimtAsInteger,nAsInteger,lastAsInteger n=0: last=1 flag=True DoWhile ′ (1) flag=False For ′ (2) Ifa(j)>a(j-1)Then t=a(j): a(j)=a(j-1): a(j-1)=t last=j-1 flag=True ′有交换发生 EndIf Nextj n=n+1 Loop Fori=1To100 List2.AddItemStr(a(i)) Nexti Label3.Caption=“本次排序的冒泡遍数为: ”&Str(n) EndSub 其中,方框 (1)处应改正为________; 方框 (2)处应改正为________。 解析 flag表示有无交换的标志,如果本趟中没有发生数据的交换,表示数据已经有序,flag=True语句出现在交换模块中,有交换还要循环,因此循环的条件是flag=True。 每趟比较的结束位置是last+1,但从大到小的步长是-1。 答案 (1)flag (2)j=100tolast-1 Step -1 【例2】有如下程序段: Fori=1To5 Forj=10Toi+2Step-1 Ifa(j) t=a(j): a(j)=a(j-2): a(j-2)=t EndIf Nextj Nexti 数组元素a (1)至a(10)的值分别为“3,17,2,14,15,6,7,18,9,4”,执行该程序段后,数组元素a(8)中的值为( ) A.3B.4C.15D.17 解析 从比较对象a(j)和a(j-2)看,属于奇数位和偶数位分别进行升序排列,每趟有2个数据有序,因此只要进行n\2趟排序。 偶数位的数据有17,14,6,18,4,升序排列中第2大的数是17。 答案 D 【变式训练1】有一组正整数,基于冒泡排序对其中的数进行升序排序。 排序后奇数在前,偶数在后。 排序示例如下 排序前 78 30 64 39 49 4 8 32 18 32 排序后 39 49 83 4 8 18 30 32 64 78 实现上述功能的VB程序如下,但加框处代码有误,请改正。 Constn=10 Dimd(1Ton)AsInteger PrivateSubCommand1_Click() DimiAsInteger,jAsInteger,tAsInteger ′读取一组正整数,存储在数组d中,代码略 i=1 DoWhilei<=n-1 Forj=nToi+1Step-1 Ifd(j)Mod2=d(j-1)Mod2Then If Then ′ (1) t=d(j): d(j)=d(j-1): d(j-1)=t EndIf ′ (2) t=d(j): d(j)=d(j-1): d(j-1)=t EndIf Nextj i=i+1 Loop ′依次输出排序后的数据,代码略 EndSub 解析 条件d(j)Mod2=d(j-1)Mod2成立,表示相邻两个数都是奇数或都是偶数,相邻两个数进行比较,并且把小的数换到前面。 如果是一奇一偶,且偶数在前,要把偶数换到后面。 答案 (1)a(j) (2)ElseIf a(j-1)Mod2=0 Then 考点2 从前往后冒泡排序 1.对称位置: 在数组a (1)至a(n)中,有下列数组元素的位置是左右对称的,如a (1)与a(n),a (2)与a(n-1),a(3)与a(n-2)等,两个左右对称数组元素位置的下标之和是一个定值n+1,因此可以到结论: 与下标为i的数组元素左右对称的位置是n-i+1。 2.以n(n=5)个元素从前往后冒泡升序排序为例,完成下列表格。 趟数 排序区间 第1次 第2次 第3次 第4次 j终值 比较次数 有序区间 j j+1 j j+1 j j+1 j j+1 i=1 [1,n] 1 2 2 3 3 4 4 5 4 4 [n,n] i=2 [1,n-1] 1 2 2 3 3 4 3 3 [n-1,n] i=3 [1,n-2] 1 2 2 3 2 2 [n-2,n] i=4 [1,n-3] 1 2 1 1 [n-3,n] ①第i趟冒泡,把最大或最小的元素交换到与他左右对称的位置n-i+1的位置,实现从第n-i+1个位置到第n个位置的元素有序。 数组后面的元素先有序。 ②第i趟排序的区间是[1,n-i+1],因此每趟排序的比较的位置(j的初值)为1。 3.每趟排序的算法 第i趟的排序实现在区间[1,n-i+1]中,从第1个位置的数开始,依次与后面相邻的数比较,如果逆序即交换,比较和交换的对象为a(j)和a(j+1),比较完后向后移动,直到j+1的位置到达最后面的位置n-i+1为止,此时j=n-i。 实现区间[n-i+1,n]的数据有序。 4.每趟排序实现了[n-i+1,n]之间的数据有序,因此下趟排序的区间为[1,n-i]。 记录第i趟排序最后一次交换的位置j,此时表示[j+1,n]已经有序,下趟排序的区间可以修改为[1,j],当j小于n-i时,就缩小下趟排序的区间,减少排序的次数,达到优化排序的效果。 5.核心代码 优化前的代码 优化后的代码 i=1 DoWhilei<=n-1 j=1 DoWhile j<=n-i If a(j) t=a(j): a(j)=a(j+1): a(j+1)=t EndIf j=j+1 Loop i=i+1 Loop flag=True: bottom=n-1 DoWhile flag=True j=1: flag=False DoWhile j<=bottom
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高考专题复习专题七 排序算法的程序实现信息技术 高考 专题 复习 排序 算法 程序 实现 信息技术
![提示](https://static.bdocx.com/images/bang_tan.gif)