“奧運(yùn)排行榜”教學(xué)思路
說(shuō)在前面
“奧運(yùn)排行榜”是一個(gè)源于實(shí)際的排序問(wèn)題,每個(gè)國(guó)家的信息是一條記錄,包含編號(hào)、國(guó)家/地區(qū)、人口數(shù)量、各獎(jiǎng)牌數(shù)等數(shù)據(jù)項(xiàng),根據(jù)不同的排序標(biāo)準(zhǔn),對(duì)各條記錄進(jìn)行排序。
教材程序采用一個(gè)二維數(shù)組來(lái)存儲(chǔ)數(shù)據(jù),每個(gè)元素表示一條記錄,排序時(shí)可以對(duì)整條記錄進(jìn)行交換操作。教材還提供了“思考與練習(xí)”,繼續(xù)研究不同數(shù)據(jù)結(jié)構(gòu)和排序要求下,冒泡排序的不同實(shí)現(xiàn)方法,要求學(xué)生理解數(shù)據(jù)結(jié)構(gòu)與算法的關(guān)系,值得深入探討。

教材文本




教材處理
學(xué)生任務(wù)單
問(wèn)題解析
(1)a是一個(gè)二維數(shù)組,其元素值是一個(gè)字符串?dāng)?shù)組,其中a[3]的值為['53', '美國(guó)', '32262', '36', '38', '36', '110'],a[3][3]也是一個(gè)字符串,可以使用int(a[3][3])將其轉(zhuǎn)換成整數(shù),表示金牌數(shù)量。
(2)書(shū)中程序采用冒泡排序算法,以金牌數(shù)為關(guān)鍵字,對(duì)數(shù)組a進(jìn)行降序排序。因?yàn)閍[0]存儲(chǔ)的是標(biāo)題,故不參與排序。程序的內(nèi)層循環(huán)從下標(biāo)1開(kāi)始遍歷數(shù)組,這樣可以跳過(guò)a[0]。
(3)填空1:len(a) - i;
填空2:int(a[j][3]) < int(a[j+1][3]);
填空3:a[j+1], a[j];
填空4:i。
(4)填空1:item[1] for item in reader[1:];
填空2:item[1] for item in reader[1:];
填空3: a1[j], a1[j+1] = a1[j+1], a1[j]
a2[j], a2[j+1] = a2[j+1], a2[j]
a3[j], a3[j+1] = a3[j+1], a3[j]
a4[j], a4[j+1] = a4[j+1], a4[j]
a5[j], a5[j+1] = a5[j+1], a5[j]
a6[j], a6[j+1] = a6[j+1], a6[j]
a7[j], a7[j+1] = a7[j+1], a7[j]
填空4:[a1[i],a2[i],a3[i],a4[i],a5[i],a6[i],a7[i]]。
(5)參考代碼如下:
import csv
#數(shù)據(jù)讀入
csvFile = open("jp.csv", "r") #打開(kāi)相應(yīng)數(shù)據(jù)文件
reader = list(csv.reader(csvFile)) # 轉(zhuǎn)換成列表,以便跳過(guò)第一行
a = []
for item in reader[1:]:
a.append(item)
csvFile.close()
#排序:關(guān)鍵字“國(guó)民人均獎(jiǎng)牌數(shù)”,按升序排序
for i in range(1,len(a)):
for j in range(len(a) - i):
if int(a[j][6])/int(a[j][2]) > int(a[j+1][6])/int(a[j+1][2]):
a[j], a[j+1] = a[j+1], a[j]
#數(shù)據(jù)寫(xiě)入
csvFile2 = open('jp2.csv','w', newline='')
writer = csv.writer(csvFile2, dialect='excel')
writer.writerow(reader[0]) #先寫(xiě)入標(biāo)題
for i in a:
writer.writerow(i)
csvFile2.close()
課后作業(yè)
任務(wù)(4)以7個(gè)一維數(shù)組來(lái)存儲(chǔ)數(shù)據(jù),當(dāng)以金牌數(shù)為關(guān)鍵字進(jìn)行降序排序時(shí),不僅是對(duì)a4排序,其他6個(gè)數(shù)組的元素值也要相應(yīng)變化,效率不高。因?yàn)檫@7個(gè)數(shù)組的結(jié)構(gòu)一致,相同下標(biāo)對(duì)應(yīng)同一個(gè)國(guó)家,故我們可以增加一個(gè)索引數(shù)組b,專(zhuān)門(mén)用來(lái)存儲(chǔ)這7個(gè)數(shù)組的下標(biāo),這樣只需對(duì)索引數(shù)組b排序,數(shù)組a1-a7可以保持不變。輸出數(shù)組元素時(shí),只要設(shè)置正確的索引值,就能實(shí)現(xiàn)排序的效果。
這種排序方法被稱為“索引排序”,參考代碼如下,請(qǐng)將缺失的代碼補(bǔ)充完整。
需要本文word文檔、源代碼和課后思考答案的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,“Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專(zhuān)注Python算法,感興趣就一起來(lái)!
