# 【wk14_1207】演算法_排序與搜尋 ### 【inclass practice】 實作3: 下列名單為本期大樂透的中獎名單name=['David','Lily','Chiou','Bear','Shantel','Chynthia'], 讓使用者輸入一個姓名,輸入的字元大小寫不分, 例如輸入 david、David、DAVID都是同一人, 請以 (1)循序法 (2)二分搜尋法檢查該名單是否中獎, 並顯示查詢結果。 ```python num=[256,731,943,389,142,645,829,945] name=["林小虎","王中森","邵木淼","李大同","陳子孔","鄭美麗","曾溫柔","錢來多"] #no = int(input("請輸入中獎者的編號:")) no = 945 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次 ```python names=["David","Lily","Chiou","Bear","Shantel","Cynthia"] n=len(names)-1 # 串列長度-1 for i in range(0,n): for j in range(0,n-i): if (names[j]>names[j+1]): # 由小到大排序 names[j],names[j+1]=names[j+1],names[j] # 互換 while True: name = input("請輸入中獎者的名單(Enter結束):") if (name==""): break IsFound=False min=0 max=n while(min<=max): mid=int((min+max)/2) if (names[mid].upper()==name.upper()): #姓名相符 IsFound=True break if (names[mid].upper()>name.upper()): #如果中間值大於輸入值 max=mid-1 #使用較小的一半區域繼續比對 else: #如果中間值不大於輸入值 min=mid+1 #使用較大的一半區域繼續比對 if (IsFound==True): print("恭喜您,",name,"中獎了!") else: print("可惜,",name,"未中獎!") ``` 請輸入中獎者的名單(Enter結束):bear 恭喜您, bear 中獎了! 請輸入中獎者的名單(Enter結束):amanda 可惜, amanda 未中獎! 請輸入中獎者的名單(Enter結束): ```python def switch(i) : datas[i], datas[i+1] = datas[i+1], datas[i] datas = [31,5,12,1] print("排序前", datas) n = len(datas) #for i in range(0, n-1): for i in range(n-1): #print(f"i = {i}, j= {j}", end=" ") for j in range(0, n-1): print(f"i = {i}, j= {j} : [j]={datas[j]}, [j+1]={datas[j+1]}", end=" ") if datas[j] > datas[j+1] : switch(j) print(f"交換後 : [j]={datas[j]}, [j+1]={datas[j+1]}", end="\n ") else : print(f"不交換 \n") print(f"{datas} \n" ) print("排序後", datas) ``` 排序前 [31, 5, 12, 1] i = 0, j= 0 : [j]=31, [j+1]=5 交換後 : [j]=5, [j+1]=31 i = 0, j= 1 : [j]=31, [j+1]=12 交換後 : [j]=12, [j+1]=31 i = 0, j= 2 : [j]=31, [j+1]=1 交換後 : [j]=1, [j+1]=31 [5, 12, 1, 31] i = 1, j= 0 : [j]=5, [j+1]=12 不交換 i = 1, j= 1 : [j]=12, [j+1]=1 交換後 : [j]=1, [j+1]=12 i = 1, j= 2 : [j]=12, [j+1]=31 不交換 [5, 1, 12, 31] i = 2, j= 0 : [j]=5, [j+1]=1 交換後 : [j]=1, [j+1]=5 i = 2, j= 1 : [j]=5, [j+1]=12 不交換 i = 2, j= 2 : [j]=12, [j+1]=31 不交換 [1, 5, 12, 31] 排序後 [1, 5, 12, 31] ### 【afterclass practice】 【OMP feedback】 專業 技術 其他