### wk13_1130_演算法_排序與搜尋 #### ch08_演算法_排序與搜尋 - 8.1 認識演算法 - 8.2 排序 泡沫排序 追蹤泡沫排序過程 - 8.3 搜尋 循序搜尋 二分搜尋 #### 【inclass practice】 ##### {範例} 由小排到大排序 \<bubble> 追蹤泡沫排序法的過程 \<bubble_debuge> ```python def switch(i) : datas[i], datas[i+1] = datas[i+1], datas[i] datas = [3,5,2,1] print("排序前", datas) switch(2) print("排序後", datas) ``` 排序前 [3, 5, 2, 1] 排序後 [3, 5, 1, 2] ```python def switch(i) : datas[i], datas[i+1] = datas[i+1], datas[i] datas = [31,50,42,1] print("排序前", datas) n = len(datas) for i in range(0, n): for j in range(0, n-1): if datas[j]<datas[j+1]: switch(j) print("排序後", datas) ``` 排序前 [31, 50, 42, 1] 排序後 [50, 42, 31, 1] ```python def switch(i) : datas[i], datas[i+1] = datas[i+1], datas[i] datas = [14,50,42,20] print("排序前", datas) n = len(datas) for i in range(0, n): print(f"i = {i}, j = {j}",end="") for j in range(0, n-1): if datas[j]<datas[j+1]: switch(j) print("排序後", datas) ``` 排序前 [14, 50, 42, 20] i = 0, j = 0i = 1, j = 2i = 2, j = 2i = 3, j = 2排序後 [50, 42, 20, 14] ###### 期末專題參考 - {實戰#3} : 透過 Python 抓取 Wiki 頁面訊息 wikipedia 工具 ```python ! pip install requests beautifulsoup4 ``` Requirement already satisfied: requests in c:\users\cjc11\anaconda3\lib\site-packages (2.31.0) Requirement already satisfied: beautifulsoup4 in c:\users\cjc11\anaconda3\lib\site-packages (4.12.2) Requirement already satisfied: charset-normalizer<4,>=2 in c:\users\cjc11\anaconda3\lib\site-packages (from requests) (2.0.4) Requirement already satisfied: idna<4,>=2.5 in c:\users\cjc11\anaconda3\lib\site-packages (from requests) (3.4) Requirement already satisfied: urllib3<3,>=1.21.1 in c:\users\cjc11\anaconda3\lib\site-packages (from requests) (1.26.16) Requirement already satisfied: certifi>=2017.4.17 in c:\users\cjc11\anaconda3\lib\site-packages (from requests) (2023.7.22) Requirement already satisfied: soupsieve>1.2 in c:\users\cjc11\anaconda3\lib\site-packages (from beautifulsoup4) (2.4) ```python import requests from bs4 import BeautifulSoup import webbrowser while True: ur1 = requests.get("https://zh.wikipedia.org/wiki/special:Random") soup = BeautifulSoup(ur1.content, "html.parser") title = soup.find(class_="firstHeading").text print(f"{title} \nDo you want to view it? (Y/N)") ans = input("").lower() if ans == "y": ur1 = "https://zh.wikipedia.org/wiki/%s" % title webbrowser.open(ur1) break elif ans == "n": print("Try again") continue else: print("Wrong choicel") break ``` 嘉玛尤诺斯 Do you want to view it? (Y/N) y #### 【afterclass practice】 1. 綜合演練 選擇題1-10 (需抄題在markdown cell ; 有程式碼的題目要有code cell ) 2. 名詞解釋 : 演算法、虛擬碼、流程圖 ###### 綜合演練 選擇題1-10 1. 執行下列程式,下列結果何者正確? datas=[3,5,2,1] n=len(datas)-1 for i in range(0,n): for j in range(0,n-i): if (datas[j]>datas[j+1]): datas[j],datas[j+1]=datas[j+1],datas[j] print(datas) (A) [3,5,2,1] (B) [ 5,3,2,1] (C) [1,2,3,5] (D) [3,5,1,2 ] Ans:( C ) 2. 執行下列程式,下列顯示結果何者正確? num=[67,12,9,52,91,3] no=52 for i in range(len(num)): if (num[i]==no): break print(i) (A) 52 (B) i (C) no (D) 3 Ans:( D ) 3. 下列那一個排序法,在執行搜尋前必須先將資料排序? (A) 循序搜尋法 (B) 二分搜尋法 (C) 泡沫搜尋法 (D) 以上皆是 Ans:( B ) 4. 有 10000 筆資料時,使用循序搜尋最少需多少次? (A) 1 (B) 10000 (C) 15 (D) 14 Ans:( A ) 5. 有 10000 筆資料時,使用循序搜尋最多需多少次? (A) 1 (B) 10000 (C) 15 (D) 14 Ans:( B ) 6. 有 10000 筆資料時,使用二分搜尋最多需多少次? (A) 1 (B) 10000 (C) 15 (D) 14 Ans:( D ) 7. 下列那一種搜尋方法效率最好? (A)二分搜尋 (B)循序搜尋 (C)泡沫搜尋 (D)三者效率相同 Ans:( A ) 8. 執行下列程式,下列結果何者正確? num=[256,731,943,389,142,645,829,945] name=["林小虎","王中森","邵木淼","李大同", "陳子孔","鄭美麗","曾溫柔","錢來多"] no = 100 IsFound=False for i in range(len(name)): #逐一比對搜尋 if (num[i]==no): #號碼相符 IsFound=True #設旗標為 True break #結束比對 if (IsFound==True): print("中獎者的姓名為:",name[i]) else: print("無此中獎號碼!") print("共比對 %d次 " %(i+1)) Ans:( D ) 9. 同第 8 題,中獎者的姓名為? (A)錢來多 (B)曾溫柔 (C)鄭美麗 (D)無此中獎號碼! Ans:( D ) 10. 同第 8 題,這個程式是? (A)二分搜尋 (B)循序搜尋 (C)泡沫搜尋 (D)以上皆非 Ans:( B ) ```python #1. 執行下列程式,下列結果何者正確? datas=[3,5,2,1] n=len(datas)-1 for i in range(0,n): for j in range(0,n-i): if (datas[j]>datas[j+1]): datas[j],datas[j+1]=datas[j+1],datas[j] print(datas) ``` [1, 2, 3, 5] ```python # 2. 執行下列程式,下列顯示結果何者正確? num=[67,12,9,52,91,3] no=52 for i in range(len(num)): if (num[i]==no): break print(i) ``` 3 ```python #8. 執行下列程式,下列結果何者正確? #9.同第 8 題,中獎者的姓名為? #10. 同第 8 題,這個程式是? num=[256,731,943,389,142,645,829,945] name=["林小虎","王中森","邵木淼","李大同","陳子孔","鄭美麗","曾溫柔","錢來多"] no = 100 IsFound=False for i in range(len(name)): #逐一比對搜尋 if (num[i]==no): #號碼相符 IsFound=True #設旗標為 True break #結束比對 if (IsFound==True): print("中獎者的姓名為:",name[i]) else: print("無此中獎號碼!") print("共比對 %d次 " %(i+1)) ``` 無此中獎號碼! 共比對 8次 ###### 名詞解釋 : 演算法、虛擬碼、流程圖 - 演算法(Algorithm):演算法是一系列解決問題步驟的有序集合,是解決特定問題或執行特定任務的程式計算過程。 - 虛擬碼(Pseudocode):虛擬碼是一種高階描述性程式碼,它類似於程式碼但不是任何特定編程語言的真正語法。虛擬碼用於描述算法或程式的邏輯結構,以一種易於理解和解釋的方式呈現,可以作為開發程式碼之前的藍圖。 - 流程圖(Flowchart):流程圖是一種視覺化的圖形表示法,用於描述演算法、程序或系統中的流程和步驟。它以不同的符號和箭頭來表示不同的操作步驟、決策和控制流程,幫助理解算法的執行邏輯。 #### 【self practice】 ```python def disp_scores(): for score in scores: print(score,end=" ") print() scores = [] while True: inscore = input("請輸入學生的成績:") if (inscore==""): # 雙擊 enter結束 break scores.append(int(inscore)) print("排序前:",end=" ") disp_scores() n=len(scores)-1 for i in range(0,n): for j in range(0,n-i): if (scores[j]<scores[j+1]): # 由大到小排序 scores[j],scores[j+1]=scores[j+1],scores[j] # 兩數互換 print("成績由大到小排序:",end="") disp_scores() # 顯示排序後串列 ``` 請輸入學生的成績:96 請輸入學生的成績:89 請輸入學生的成績:79 請輸入學生的成績:96 請輸入學生的成績:93 請輸入學生的成績:92 請輸入學生的成績:80 請輸入學生的成績:66 請輸入學生的成績:75 請輸入學生的成績: 排序前: 96 89 79 96 93 92 80 66 75 成績由大到小排序:96 96 93 92 89 80 79 75 66 ```python num=[67,12,9,52,91,3] datas=[] for i in range(0,3): no = int(input("請輸入第 " + str(i+1) + " 個號碼:")) datas.append(no) n=0 for i in range(0,3): for j in range(len(num)): if (num[j]==datas[i]): n+=1 break if (n>0): print("恭喜您,中了",n,"個號碼!") else: print("可惜,您未中獎!") ``` 請輸入第 1 個號碼:3 請輸入第 2 個號碼:24 請輸入第 3 個號碼:60 恭喜您,中了 1 個號碼!