# Python 實作 Binary Search
>以下提供兩種不同情況以及Unit Test
## 第一種作法
### 單純尋找特定元素在一以排序陣列中
假設我們有一個以排序陣列 `nums = [1,3,5,7,9,11,13,15]` 和要尋找的目標 `target = 11`,如果`target`存在於`nums`中,返回該索引位置,否則返回`-1`
#### 程式碼
```
def BS(nums,target):
if target not in nums:
return -1
else:
return nums.index(target)
```
## 第二種做法
### 尋找特定元素在一以排序陣列中的索引位置,如果不存在索引位置即返回元素可插入位置
假設我們有一個以排序陣列 `nums = [2,4,6,8,10,12,14,16]` 和要尋找的目標 `target = 3`,如果`target`存在於`nums`中,返回該索引位置,否則返回可以插入元素的位置`1`
#### 程式碼
```
def BS(nums:list,target:int) -> int:
if target in nums:
return nums.index(target)
f = 0
r = len(nums)-1
while r >= f:
mid = (f+r)//2
if target == nums[mid]:
return nums.index(mid)
if nums[mid] > target:
r = mid-1
if nums[mid] < target:
f = mid+1
return f
```
## 測試
以下提供該測試程式,可套用上述兩種狀況
```
test = [[1,3,5,7,9,11,13,15],[2,4,6,8,10,12,14,16]]
tar = [11,3]
out = [5,1]
for idx in range(len(test)):
try:
result = BS(test[idx],tar[idx])
if result == out[idx]:
print(f'case: {idx+1} pass!')
else:
print(f'case: {idx+1} fail!')
except Exception as ex:
print(f'we got some error, here is error msg: {ex}')
```