資源簡介 (共22張PPT)5.3 數 據 排 序—— 排序算法的應用冊 別:選擇性必修1學 科:高中信息技術(浙教版)學習目標:能對給定的文件中的數據進行抽象并建立模型。能合理選用數據結構,設計排序算法。能用Python語言編寫具體的排序程序。能自覺對學習生活具體問題抽象建模、設計算法并編寫程序及調試程序,如:對成績進行同分同名次排名、按排車輛考場等。閱讀教材P132-134,可根據個性學習暫?;蚣铀俨シ耪n程。想一想:請你給下面的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]) 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫