---
# System prepended metadata

title: Python 實作 Binary Search
tags: [python]

---

# 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}')
```