# Algorithm 演算法 - 線性搜尋系列 Binary Search 二元搜尋

# 基礎概念

Binary Search 的概念類似 Quick Sort 中的概念。Binary Search 需要仰賴已經排序好的資料，所以雖然搜尋的效率比線性搜尋來得高，但是刪減資料都會需要耗費另外的成本做排序。
而其實做方式有兩種：Iteration 和 Recursion。

Time Complexity：
* Best： `O(1)`
* Average：`O(log n)`
* Worst：`O(log n)`

Space Complexity： `O(1)`

## 實作

### Python

#### Iteration

```python
def binarySearch(arr, l, r, x):
 
    while l <= r:
 
        mid = l + (r - l) // 2
 
        # Check if x is present at mid
        if arr[mid] == x:
            return mid
 
        # If x is greater, ignore left half
        elif arr[mid] < x:
            l = mid + 1
 
        # If x is smaller, ignore right half
        else:
            r = mid - 1
 
    # If we reach here, then the element
    # was not present
    return -1
```

#### Recursion

```python
def binarySearch(arr, l, r, x):
 
    # Check base case
    if r >= l:
 
        mid = l + (r - l) // 2
 
        # If element is present at the middle itself
        if arr[mid] == x:
            return mid
 
        # If element is smaller than mid, then it
        # can only be present in left subarray
        elif arr[mid] > x:
            return binarySearch(arr, l, mid-1, x)
 
        # Else the element can only be present
        # in right subarray
        else:
            return binarySearch(arr, mid + 1, r, x)
 
    else:
        # Element is not present in the array
        return -1
```
