---
# System prepended metadata

title: Wk_14

---

### Wk14_B1121138_邱冠誠
ch08_演算法_排序與搜尋

 	
8.1  認識演算法

8.2  排序

    泡沫排序
    追蹤泡沫排序過程
8.3 搜尋

    循序搜尋
    二分搜尋
 
【inclass practice】

{綜合演練}

實作2 :

    俊民將中獎號碼建立成串列num=[67,12,9,52,91,3]，
    讓妹妹輸入三個號碼，再以循序搜尋方法檢查這三個號碼種有幾個中獎，
    並顯示其結果。

實作3:

    下列名單為本期大樂透的中獎名單name=['David','Lily','Chiou','Bear','Shantel','Chynthia']，
    讓使用者輸入一個姓名，輸入的字元大小寫不分，
    例如輸入 david、David、DAVID都是同一人，
    請以二分搜尋法檢查該名單是否中獎，
    並顯示查詢結果。


```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-i):
        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
     [5, 1, 12, 31] 
    
    i = 2, j= 0 : [j]=5, [j+1]=1 交換後 : [j]=1, [j+1]=5
     [1, 5, 12, 31] 
    
    排序後 [1, 5, 12, 31]
    


```python
# 3.中獎者姓名(循序搜尋) <sequential>
num=[256,731,943,389,142,645,829,945]
name=["林小虎","王中森","邵木淼","李大同","陳子孔","鄭美麗","曾溫柔","錢來多"]
no = int(input("請輸入中獎者的編號："))
 
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)) 
```

    請輸入中獎者的編號：111
    無此中獎號碼！
    共比對 8次 
    


```python
#4. 二分搜尋 : 中獎者姓名 <binary>
num=[256,731,943,389,142,645,829,945,371,418]
name=["林小虎","王中森","邵木淼","李大同","陳子孔","鄭美麗","曾溫柔","錢來多","賈天良","吳水品"] 

n=len(num)-1 # 串列長度-1
IsFound=False
min=0
max=n
c=0 #計算比對次數 

for i in range(0,n): 
    for j in range(0,n-i):         
        if (num[j]>num[j+1]): # 由小到大排序
            num[j],num[j+1]=num[j+1],num[j]     # 兩數互換
            name[j],name[j+1]=name[j+1],name[j] # 姓名互換
 
no = int(input("請輸入中獎者的編號："))

while(min<=max):
    mid=int((min+max)/2)
    c+=1  #比對次數加 1
    if (num[mid]==no):  #號碼相符 
        IsFound=True
        break

    if (num[mid]>no):  #如果中間值大於輸入值 
       max=mid-1      #使用較小的一半區域繼續比對 
    else:             #如果中間值不大於輸入值 
       min=mid+1      #使用較大的一半區域繼續比對 
       
if (IsFound==True):
    print("中獎者的姓名為：",name[mid])
else:
    print("無此中獎號碼！")
print("共比對 ", c ," 次")    
```

    請輸入中獎者的編號：256
    中獎者的姓名為： 林小虎
    共比對  2  次
    


```python

```
