资源简介 (共37张PPT)排序算法专题复习教学目标:归并排序,选择排序,插入排序,冒泡排序的基础代码格式教学难点:冒泡排序的优化教学难点处理方案:例题剖析+逐层递进我们学过的排序算法:1.冒泡排序(首考已考,最重要)2.选择排序(首考未考,但要会看基础代码)3.插入排序(首考未考,地方卷喜欢考)4.归并排序(首考已考,思想重要如链表合二归一就是归并排序的变式,地方卷几乎没考过)由于冒泡排序我们已经做过很多题,我们倒着从最不熟悉的开始4,3,2,1lst1,lst2各自已按首位“时间”升序排序,要把lst2归并到lst1中,使得lst1整体依然升序4.归并排序23.1首考真题再现def merge(lst1, lst2):i = len(lst1) - 1j = len(lst2) - 1for t in range(len(lst2)):lst1.append([0, 0, 0]) # 为lst1追加一个元素[0, 0, 0]k = len(lst1) - 1while j >= 0:if i >= 0 and lst1[i][0] > lst2[j][0]:lst1[k] = lst1[i]i -= 1else:lst1[k] = lst2[j]j -= 1k -= 1return lst14.归并排序23.1首考真题再现问:while语句中循环体的执行次数?A3.插入排序3.插入排序:习题集p68T1 1.【2022年6月宁波九校高二信息技术第11题】1.有如下python程序段,运行该程序段后,列表a中的值可能是( )import randoma = []for i in range(6):a.append(random.randint(1,5)*2+i%2)for i in range(1,5):j = i; k = a[j]while a[j-1]0:a[j] = a[j-1]; j=j-1a[j] = kA.11,8,7,6,5,5 B.8,6,5,5,3,8 C.9,6,7,8,8,11 D.11,11,8,2,2,11a=[偶,奇,偶,奇,偶,奇]0 1 2 3 4 5D2.经典选择排序的代码:a = [3, 2, 5, 4, 1] # 经典选择排序n=len(a)#找比i项小且最小的数的下标j赋值给k,然后a[i]和a[k]互换for i in range(n-1):#i标记待排序区间左边界k=ifor j in range(i+1,n):#扫描待排序区间,找最小值下标j,给k=j,用当前数a[i]和a[k]互换if a[j] k=jif k!=i:#若a[i]不是最小值则将最小值交换到下标为i的位置a[i], a[k] = a[k], a[i]数据变化过程如下:[3, 2, 5, 4, 1][1, 2, 5, 4, 3][1, 2, 3, 4, 5]练习1. 某 Python程序段如下 :for i in range(2) :k = ifor j in range( i+ 1 ,5) :if a[j] > a[k] ; k = jif i ! = k : t = a[i] ; a[i] = a[k] ; a[k] = t数组元素 a[0] 到 a[4] 的数据依次为“10,41,75, 12,63”。则此程序运行完成后数组元素a[0] 到 a[4] 的数据依次是 ( )A. 75, 63, 41, 12, 10 B. 10, 12, 41, 63, 75C. 10, 12, 75, 41, 63 D. 75, 63, 10, 12, 41D练习2. 利用如下 Python程序段对列表 a其进行处理 :a=[‘15’, ’2’, ’5’, ’43’, ’24’]i=4while i>0:k=ifor j in range(i) :if a[k] a[k] ,a[i] =a[i] ,a[k]i=i- 1print(a)该程序段执行后输出的内容是 ( )A. [’15’, ’2’, ’24’, ’43’, ’5’] B.[’5’, ’15’, ’2’, ’43’, ’24’]C. [’5’, ’15’, ’2’, ’24’, ’43’] D. [’2’, ’5’, ’15’, ’24’, ’43’]A2023.03杭州地区(含周边)重点中学卷(双向选择排序,最小的向前换,最大的向后换)小明利用“在线社团报名系统”收集了全校学生的社团报名信息,并将报名数据导出到“社团报名.xlsx”中,如第14题图1 所示。然后编写Python程序对报名数据进行处理,生成分别以班级名和社团名为文件名的Excel文件,以便分发给相应的社团指导老师和班主任。第14题图1 第14题图2(1)在对表格进行数据整理时发现,关于“Jacky.Y” 同学的记录可能存在的数据问题是__▲___(选填:A.数据缺失 B.数据异常 C.逻辑错误 D.数据格式不一致)。(2)其中生成每个社团名单文件的过程是:先对报名数据按社团名称进行分类,并对选报同一社团的学生按班级进行升序排序,然后生成各个社团名单文件,如第14题图2所示。对应的程序代码如下,请在划线处填写合适的代码。D(2)其中生成每个社团名单文件的过程是:先对报名数据按社团名称进行分类,并对选报同一社团的学生按班级进行升序排序,然后生成各个社团名单文件,如第14题图2所示。对应的程序代码如下,请在划线处填写合适的代码。import pandas as pddef read_file(filename):#读入报名数据的原始文件,并将表中的数据转换成列表,代码略def save_file(a): #保存名单到相应社团的Excel电子表格文件df = pd.DataFrame(a,columns=[“班级”,“姓名”,“选报社团”])df.to_excel( ① +“.xlsx”,index=False)a = read_file(“社团报名.xlsx”)n = len(a)# 按社团名(参照拼音的字母顺序)进行升序排序,代码略# 统计各社团人数,存在列表rs中,rs=[[“滑板社”,36],…],代码略① a[0][2] 或 df.at[0,“选报社团”] 或 df[“选报社团”][0]s = 0for i in range(len(rs)):②left,right = s, s+num-1while left < right:imin = imax = leftfor k in range(left+1,right+1):if a[k][0] < a[imin][0]:imin = kelif a[k][0] > a[imax][0]:imax = kif imin != left:a[imin],a[left] = a[left],a[imin]if imax == left:③if imax != right:a[imax],a[right] = a[right],a[imax]left = left + 1; right = right–1④s += numnum=rs[i][1]imax = iminsave_file(a[s:s+num])1:冒泡排序的基本思想每一轮从第0位或len(a)-1开始,通过相邻元素的比较,将较大或较小的数向后或向前推移的排序技术。由此会产生4种冒泡排序组合:1、从前向后冒,大的往后跑,升序2、从前向后冒,小的向后跑,降序3、从后向前冒,大的向前跑,降序4、从后向前冒,小的向前跑,升序1、从前向后冒,大的往后跑,升序a = [5, 2, 1, 4, 3] # 从前向后冒,大的往后跑,升序for i in range(1,len(a)): #外循环i控制冒泡轮数 for j in range(len(a)-i): #内循环j控制冒泡方向 if a[j]>a[j+1]: #前一项>后一项 a[j], a[j+1] = a[j+1], a[j] print(a)#监控数据变化j=0或1小数开始,从前向后冒j=len(a)-1大数开始,从后向前冒2、从前向后冒,小的向后跑,降序a = [5, 2, 1, 4, 3]for i in range(1,len(a)): #外循环i控制冒泡轮数 for j in range(len(a)-i): #内循环j控制冒泡方向 if a[j]j=0或1小数开始,从前向后冒j=len(a)-1大数开始,从后向前冒3、从后向前冒,小的向前跑,升序a = [5, 2, 1, 4, 3] for i in range(1,len(a)): for j in range(len(a)-1,i-1,-1): if a[j] 4、从后向前冒,大的向前跑,降序a = [4, 2, 1, 5, 3]for i in range(1,len(a)): for j in range(len(a)-1,i-1,-1): if a[j] >a[j-1]: a[j], a[j-1] = a[j-1], a[j]外循环i和内循环j,合作控制冒泡的范围2len(a)-2[4, 5, 3, 2, 1][5, 4, 2, 1, 3]排序后:a = [5, 4, 3, 2, 1]谁控制排序范围?10.列表s包含8个互不相等的元素,即s[0],s[1],s[2],……,s[7],有如下Python程序段:2023年1月首考第10题n=8for i in range(1,n-1): for j in range(1,n-i-1): if s[j]>s[j-1]: s[j],s[j-1]=s[j-1],s[j]该程序段实现的是( )A.s[0]到s[5]的降序排列 B.s[1]到s[6]的降序排列C.s[1]到s[7]的升序排列 D.s[2]到s[6]的升序排列A2023年1月首考第10题真题回顾例1: 采用冒泡排序算法对某数据序列进行排序,经过第一轮排序后的结果是"2,8,3,9,5,6,7",那么原数据序列不可能的是 ( )A.8,3,9,5,2,7,6 B.8,3,9,2,6,5,7C.8,2,9,3,5,7,6 D.8,3,2,9,6,5,7D例2:有如下python程序段,程序运行结束后,结果可能是以下哪个选项( )a=[3,1,9,7,6,3]n=len(a)for i in range(1,n):for j in range(n-2,i-2,-1):if a[j]a[j],a[j+1]=a[j+1],a[j]A.[9,3,1,7,6,3]C.[1,3,3,9,7,6]B.[9,7,6,3,3,1]D.[1,3,3,6,7,9]B外循环控制轮次,n个元素进行了n-1轮循环,说明已完成排序内循环控制轮次,步长-1,从后往前,确定前面的数后一个数比前一个数大,互换,大的往前D练习2:有如下Python程序段:a=[6,7,5,3,8,4]f=1for i in range(2):for j in range(4-2*i):if a[j]*fa[j],a[j+2]=a[j+2]f=-fprint(a)该程序段运行后,输出结果为( )A.[8,3,6,4,5,7]B.[3,4,5,6,7,8]C.[5,7,6,4,8,3]D.[6,4,8,7,5,3]变量f作用控制升降A冒泡排序算法优化a=[23,20,13,18,14,11]x=y=z=0n=len(a)for i in range(1,n):x+=1for j in range(0,n-i):y+=1if a[j]z+=1a[j],a[j+1]=a[j+1],a[j]# 统计排序加工的遍数# 统计排序的比较次数# 统计排序的交换次数#加工的遍数#单遍两两比较的范围#比较的方向程序中的x、y、z有什么作用?a=[23,20,13,18,14,11]n=len(a)for i in range(1,n):c=0for j in range(0,n-i,-1):if d[j]c+=1d[j],d[j+1]=d[j+1],d[j]if c==0:break如果一次加工过程中没有发生数据交换说明数据已经有序。更新每一遍中交换次数的存储变量用于统计每一遍中交换的次数判断数据是否已经有序优化遍数a=[23,20,13,18,14,11]n=len(a)for i in range(1,n):flag=Falsefor j in range(0,n-i,-1):if d[j]flag=Trued[j],d[j+1]=d[j+1],d[j]if flag==False:break优化遍数23.4嘉兴二模第10题10.列表s中包含n个互不相等的元素,用Python 编程实现如下功能: s[0]到s[n-1]降序排序,当序列已经有序时结束排序,部分代码如下。n=len(s)for i in range(1,n): (1) for j in range( (2) ): if (3) : s[j],s[j-1]=s[j-1],s[j] flag = True if flag==False: break上述程序段中方框可选代码为: ①flag=True ②flag=False ③1,n-i+1 ④1,n-i ⑤s[j]s[j-1],则(1)(2)(3)处代码依次为A.②④⑥ B.②③⑥ C.①④⑤ D.①③⑥ 优化遍数C典例1有如下Python程序段:d=[173,172,169,178,183]for i in range(1,len(d)):c=0for j in range(0,len(d)-i):if d[j]>d[j+1]:c+=1;d[j],d[j+1]=d[j+1],d[j]if c==0:breakprint (i)则程序运行之后,i的值为( )A. 1 B. 2 C. 3 D. 4注意:此优化会在人观察到有序后再做一遍!(不超过n-1遍)C173 172 169 178 183i=1 172 169 173 178 183i=2 169 172 173 178 1832次1次i=3 169 172 173 178 1830次优化遍数例4:有如下python程序段:a=[2,1,9,8,6,3]cnt=0for i in range(len(a)-1,0,-1):flag=Falsefor j in range(i):if a[j]>a[j+1]:a[j],a[j+1]=a[j+1],a[j]flag=Truecnt+=1if not flag:break则程序运行结束后,变量cnt的值为 ( )A.3 B.4 C.5 D.6B典例有如下Python程序段:d=[173,172,169,178,183]last=len(d)-1;s=0for i in range(1,len(d)):for j in range(0,last):s+=1if d[j]>d[j+1]:d[j],d[j+1]=d[j+1],d[j]last=jprint (s)则程序运行之后,s的值为( )A. 10 B. 8 C. 6 D. 5D列表格还原比较过程!173 172 169 178 183 比较lastj172173169172169优化加工范围练习1:已知字符串数组a的原始数据为[“128”,“26”,“9”,“61”,“15”,“2”,“318”],为了对该数组进行排序操作,小美编写了如下Python程序:for i in range(3):for j in range(6,i+1,-1):if a[j]a[j],a[j-1]=a[j-1]则程序运行后,数组a的值为( )A.[“128”,“15”,“2”,“26”,“318”,“61”,“9”]B.[“128”,“15”,“26”,“9”,“61”,“2”,“318”]C.[“128”,“15”,“2”,“26”,“9”,“61”,“318”]D.[“128”,“15”,“2”,“26”,“318”,“9”,“61”]D本题涉及到字符串比大小的问题练习2:有如下Python程序段:a=[6,7,5,3,8,4]f=1for i in range(2):for j in range(4-2*i):if a[j]*fa[j],a[j+2]=a[j+2]f=-fprint(a)该程序段运行后,输出结果为( )A.[8,3,6,4,5,7]B.[3,4,5,6,7,8]C.[5,7,6,4,8,3]D.[6,4,8,7,5,3]变量f作用控制升降A练习3.排序并去重。小美基于冒泡排序算法编写了一个Python程序,可以输出剔除重复数据后的升序排序结果。程序运行界面如图所示。排序前:[2,4,6,2,8,5,7,8,6,4]排序后:[2,4,5,6,7,8]实现上述功能的Python程序如下,请在划线处填入合适的代码。import randomn=10a=[random.randint(1,9) for i in range(10)]print(“排序前:”,a)i,top=0,n-1while ifor j in range(top,i,-1):if _______________:a[j],a[j-1]=a[j-1],a[j]elif a[j]==a[j-1]:a[j]=_______top=top-1i+=1print(“排序后: ”,_______)a[j]a[top]a[0:top+1]通过覆盖去除重复数输出排序后的元素本节课小结归并,插入,选择冒泡排序代码复习通过i,j变化了解此类题型解题的一般方法通过引入变量对冒泡排序进行简单优化n个数需要经过n-1轮冒泡才能完成整个排序过程。比较次数:(n-1)+(n-2)+(n-3)……+1=n*(n-1)/2交换次数为:0~n*(n-1)/2谢谢 展开更多...... 收起↑ 资源预览