资源简介 (共22张PPT)5.3 数 据 排 序—— 排序算法的应用册 别:选择性必修1学 科:高中信息技术(浙教版)学习目标:能对给定的文件中的数据进行抽象并建立模型。能合理选用数据结构,设计排序算法。能用Python语言编写具体的排序程序。能自觉对学习生活具体问题抽象建模、设计算法并编写程序及调试程序,如:对成绩进行同分同名次排名、按排车辆考场等。阅读教材P132-134,可根据个性学习暂停或加速播放课程。想一想:请你给下面的2022北京冬奥会金牌编制金牌排行榜。(一)抽象与建模问题:每个国家的信息是一条记录,包括编号、国家/地区、各奖牌数等数据项。实践体验:Excel排序,对记录按关键字排序,并关注交换如何进行?(一)抽象与建模问题:每个国家的信息是一条记录,包括编号、国家/地区、各奖牌数等数据项。实践体验:Excel排序,对记录按关键字排序,并关注交换如何进行?比较的是金牌数,交换的是整条记录排序前排序后(二)设计算法与数据结构:数据组织形式有两种,哪种更方便?方法一是采用6个一维数组按列存储,即每个数组分别存储每个国家的编号、国家、各奖牌数等,如定义a数组存储表中26个国家的编号;定义b数组存储表中26个国家的国家名称,其对应的值为[“中国”,”澳大利亚 ” ,”美国 ” ,”加拿大 ” , ”法国” ……]定义c数组存储表中26个国家的金牌数量,其对应的值为[4,1,5,1,1,4,0,0,8,3……];定义d数组、e数组、f数组分别存银牌、铜牌、总数a b c d e f(二)设计算法与数据结构数据组织形式有两种,哪种更方便?方法二是采用1个一维数组按行存储,每个数组元素对应某个国家的一条记录信息,如[1,中国,4,3,1,8]对应中国的相关信息。金牌为索引值[2]的元素import csv #数据读入csvFile = open("jp.csv", "r“) #打开相应数据文件reader = csv.reader(csvFile) #建立一个读入数据的对象a = []for item in reader:csvFile.close()for i in range(1,len(a)-1): #排序不包含第一行数据for j in range(1,len(a)-i):if :csvFile2 = open(‘jp2.csv’,‘w’, newline=‘’) #数据写入writer = csv.writer(csvFile2, dialect='excel‘)for i in range(len(a)):writer.writerow(a[i])csvFile2.close()(三)编写程序2022北京冬奥会金牌编制金牌排行榜(给划线处填上合适的语句)(三)编写程序(填空并调试):#数据读入import csv #导入csv模块csvFile = open(“jp.csv”, “r”) #打开jp.csv数据文件reader = csv.reader(csvFile)#建立一个读入数据的对象readera = [] #定义空列表afor item in reader: #jp.csv中的每一行为a列表一个元素,此元素为字符串a.append(item)csvFile.close() #关闭jp.csv数据文件#冒泡排序for i in range(1,len(a)-1): #排序不包含第一行数据for j in range(1,len(a)-i):#从前往后冒泡排序if int(a[j][2])a[j],a[j+1] =a[j+1],a[j] #当前记录与后一条记录交换位置csvFile2 = open(‘jp2.csv’,‘w’, newline=‘’)#数据写入到jp2.csv中writer = csv.writer(csvFile2, dialect='excel‘)for i in range(len(a)):writer.writerow(a[i])csvFile2.close()a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]a[1] 1 中国 4 3 1 8(三)编写程序 (结果如下):jp.csvjp2.csv挑战实践:请你给2022北京冬奥会金牌编制金牌排行榜添加上金牌名次,而且同分数同名次,如何继续编程实现?金牌 名次10 9 9 9 8 7 7 122256601234567挑战实践:请你给2022北京冬奥会金牌编制金牌排行榜添加上金牌名次,而且同分数同名次,如何继续编程实现?#数据读入import csv #导入csv模块csvFile = open(“jp.csv”, “r”) #打开jp.csv数据文件reader = csv.reader(csvFile)#建立一个读入数据的对象readera = [] #定义空列表afor item in reader: #每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭jp.csv数据文件#冒泡排序for i in range(1,len(a)-1): #排序不包含第一行数据(索引为0)for j in range(1,len(a)-i):#从前往后冒泡排序if int(a[j][2])a[j],a[j+1] =a[j+1],a[j] #当前记录与后一条记录交换位置#数据写入到jp2.csv中csvFile2 = open(‘jp2.csv’,‘w’, newline=‘’)writer = csv.writer(csvFile2, dialect='excel‘)for i in range(len(a)):writer.writerow(a[i])csvFile2.close()for i in range(len(a)):a[i].append('排名') #添加每行的‘排名’列c=1 #同分同名开始,c用于统计同分数的个数a[1][6]=‘1’#第一个国家第一名,注意数据类型for i in range(2,len(a)):#从第二个国家至最后一个if a[i][2]!=a[i-1][2]: #当前国家金牌数与前一个不等a[i][6]=str(int(a[i-1][6])+c)#当前国家名次是前一个国家名次+前一金牌同分数的个数c=1 #当前国家分数个数c恢复初值1个else: #当前国家金牌数与前一个相等a[i][6]=a[i-1][6] #当前国家与前一个相同名次c=c+1 #统计同分个数索引值为0 1 2 3 4 5 索引值为6编号 国家 金牌 银牌 铜牌 总数 排名10 德国 8 5 1 14 1挑战实践:(同分同名次结果)jp.csvjp2.csv学习生活中的应用实践:在刚刚结束的联盟考成绩统计中,请你帮忙编写程序,能统计各科总分,并按照总分从高到低排序,并添加上总分名次,而且同分数同名次,成绩文件为“联盟.csv”,大概有5000左右考生,最后输出到“联盟2.csv”文件中。处理前的表格处理后的表格学习生活中的应用实践:#数据读入import csv #导入csv模块s=[] #定义空列表sfile=open('联盟.csv','r') #打开联盟.csv数据文件lines=csv.reader(file))#建立一个读入数据的对象linesn=0for item in lines: #每一行为s列表一个元素,此元素为字符串s.append(item) #csv通过这种样式读入的数据为字符串n=n+1file.close#关闭联盟.csv数据文件for i in range(n): #添加2列s[i].append("总分")s[i].append("名次")for i in range(1,n): #求总分x=0for j in range(3,13):x+=float(s[i][j]) #注意数据类型s[i][13]=str(x)学习生活中的应用实践:#应用优化冒泡排序i=1;ed=1;flag=True #内循环比较交换优化、外循环遍历次数优化while i<=n-1 or flag==True: #排序不包含第一行数据(索引为0)flag=Falsefor j in range(n-1,ed,-1):#从后往前冒泡排序if float(s[j][13])>float(s[j-1][13]):#当前记录的总分比后一条记录少s[j],s[j-1]=s[j-1],s[j] #当前记录与后一条记录交换位置ed=j;flag=Trueif ed==n-1 or flag==False:break #未交换或上次交换为最后1个元素,退出while循环i+=1#数据写入到联盟2.csv中file2 = open('联盟2.csv','w', newline='') #数据写入writer = csv.writer(file2, dialect='excel')for i in range(len(s)):writer.writerow(s[i])file2.close()c=1#同分同名开始,c用于统计同分数的个数s[1][14]=‘1’第一个学生第一名,注意数据类型for i in range(2,n):if s[i][13]!=s[i-1][13]: #当前学生总分与前一个不等s[i][14]=str(int(s[i-1][14])+c)#当前学生名次是前一个学生名次+前一学生同分数的个数c=1#当前学生分数个数c恢复初值1个else: #当前学生总分与前一个相等s[i][14]=s[i-1][14]#当前学生与前一个同名次c=c+1 #统计同分个数学习生活中的应用实践:处理前的表格处理后的表格课堂小结抽象与建模编写程序并调试排序算法程序实现设计算法与数据结构学习评价对自己的表现进行客观的评价,并思考后续完善的方向。(3=优秀,2=一般,1=仍需加油)评分项 自我评价能对jp.csv文件中的数据进行抽象并建立模型 3 2 1能对jp.csv数据选用合适的数据结构,设计排序算法 3 2 1能用Python语言编写具体的排序程序(联盟考成绩排名)。 3 2 1能自觉将学习生活具体问题抽象建模、设计算法并编写程序及调试程序,如:对成绩进行同分同名次排名、排考场车辆等实际应用。 3 2 1课后作业1:秋游安排车辆某班家委会根据参加秋游的同学到达指定上车点时间和每位同学可以等待的时间信息,安排车辆接送参加秋游活动同学去秋游点白云山脚(考虑车子座位数量<=4人)。参加秋游活动同学到达上车点的时间和可以等待的时间用长度为7的字符串表示,例如out.txt中第一行“ 08:11 4 xixi”表示xixi同学当天8点11分到达上车点,最多等待4分钟(每个同学的等待时间都小于10),那么最晚8点23分出发去秋游点(若8点23分刚到的同学也一同出发)。编写 Python 程序,统计接送n个参加秋游活动同学所需的最少车辆数。运行程序,显示所有同学提交的信息,数据已经按到达时间先后排列,程序运行结果显示所需的最少车辆数。(1)若将图中最后1 行“08:16 2”数据改为“08:16 7”,请问需要 ( )辆车接送?(填数字)4课后作业:秋游安排车辆a=[];xz=4 #每辆车最多坐4人b=[];c=[]n=0 #常量初始化,n值后面另计for line in open("out.txt","r"): #从文件time.txt中读取时间数据a.append(line.strip("\n"))n+=1for i in range(n):print(a[i])print("读取out.txt文件结束,共",n,"条数据。")print("参加秋游人数n=",n)#排序for i in range(len(a)-1):for j in range(len(a)-1, #① ):if #② :a[j],a[j-1]=a[j-1],a[j]for i in range(n):b.append(0);c.append(0)b[i]=int(a[i][:2])*60+int(a[i][3:5])c[i]=b[i]+int(a[i][6:8])print(b[i],c[i])tot=0;i=0;k=1while it=c[i]j=i+1while jif b[j]<=t:k+=1;j+=1else:breakif k==xz:k=0;breaki=j# ③for i in range(n):print(a[i])print("接送所有参加秋游同学最少需要",tot,"辆车")① i,-1② a[j]③ tot+=1课后作业2:教材P134思考与练习1.结合“奥运排行榜”的例子,分别编写程序满足下列要求:(1)若数据以7个一维数组的形式存储。(2)若将排序关键字改为“奖牌数”,并按升序排序。import csv #数据读入csvFile = open("jp.csv", "r") #打开相应数据文件reader = csv.reader(csvFile) #建立一个读入数据的对象a = [] ;b=[];c=[];d=[];e=[];f=[]for item in reader:a.append(item[0])b.append(item[1])c.append(item[2])d.append(item[3])e.append(item[4])f.append(item[5])csvFile.close()for i in range(len(a)):print (a[i],b[i],c[i],d[i],e[i],f[i])for i in range(1,len(a)-1): #排序不包含第一行数据for j in range(1,len(a)-i):if int(c[j])a[j],a[j+1] =a[j+1],a[j]b[j],b[j+1] =b[j+1],b[j]c[j],c[j+1] =c[j+1],c[j]d[j],d[j+1] =d[j+1],d[j]e[j],e[j+1] =e[j+1],e[j]f[j],f[j+1] =f[j+1],f[j]for i in range(len(a)): #输出排序后的序列print (a[i],b[i],c[i],d[i],e[i],f[i]) 展开更多...... 收起↑ 资源预览