# 【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】
專業
技術
其他