74 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						||
title: Freecodecamp Algorithm Binary Search Guide
 | 
						||
localeTitle: Freecodecamp算法二进制搜索指南
 | 
						||
---
 | 
						||
二进制搜索是一种搜索算法,用于查找已排序数组中目标值的位置。
 | 
						||
 | 
						||
## 例
 | 
						||
 | 
						||

 | 
						||
 | 
						||
上图显示了当目标值为**4**时二进制搜索算法在排序数组上的工作情况。
 | 
						||
 | 
						||
## 算法
 | 
						||
 | 
						||
二进制搜索适用于已排序的数组。二进制搜索首先将数组的中间元素与目标值进行比较。如果目标值与中间元素匹配,则返回其在数组中的位置。如果目标值小于或大于中间元素,则搜索分别使用新的中间元素继续数组的下半部分或上半部分,从而消除另一半。
 | 
						||
 | 
						||
二进制搜索算法的伪代码如下:
 | 
						||
```
 | 
						||
BinarySearch(A<a href='https://repl.it/CWZq/158' target='_blank' rel='nofollow'>0..N-1], value) { 
 | 
						||
  low = 0 
 | 
						||
  high = N - 1 
 | 
						||
  while (low <= high) { 
 | 
						||
    // invariants: value > A[i] for all i < low 
 | 
						||
                   value < A[i] for all i > high 
 | 
						||
    mid = (low + high) / 2 
 | 
						||
    if (A[mid] > value) 
 | 
						||
      high = mid - 1 
 | 
						||
    else if (A[mid] < value) 
 | 
						||
      low = mid + 1 
 | 
						||
    else 
 | 
						||
      return mid 
 | 
						||
  } 
 | 
						||
  return not_found // value would be inserted at index "low" 
 | 
						||
 } 
 | 
						||
```
 | 
						||
 | 
						||
## 复杂
 | 
						||
 | 
						||
*   最差案例表现: **O(log n)**
 | 
						||
*   最佳案例表现: **O(1)**
 | 
						||
*   平均案例表现: **O(log n)**
 | 
						||
*   最坏的案例空间复杂度: **O(1)**用于迭代; **O(log n)**用于递归。
 | 
						||
 | 
						||
## C ++实现
 | 
						||
```
 | 
						||
int binarySearch(int arr[], int value, int left, int right) { 
 | 
						||
  int middle; 
 | 
						||
  while (left <= right) { 
 | 
						||
    middle = (left + right) / 2; 
 | 
						||
    if (arr[middle] == value) 
 | 
						||
      return middle; 
 | 
						||
    else if (arr[middle] > value) 
 | 
						||
      right = middle - 1; 
 | 
						||
    else 
 | 
						||
      left = middle + 1; 
 | 
						||
  } 
 | 
						||
  return -1; 
 | 
						||
 } 
 | 
						||
```
 | 
						||
 | 
						||
:rocket:\[运行代码## Python实现
 | 
						||
```
 | 
						||
def binary_search(l, value): 
 | 
						||
    low = 0 
 | 
						||
    high = len(l)-1 
 | 
						||
    while low <= high: 
 | 
						||
        mid = (low+high)//2 
 | 
						||
        if l<a href='https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":rocket:"' target='_blank' rel='nofollow'>mid] > value: high = mid-1 
 | 
						||
        elif l[mid] < value: low = mid+1 
 | 
						||
        else: return mid 
 | 
						||
    return -1 
 | 
						||
```
 | 
						||
 | 
						||
 [运行代码](https://repl.it/CWZi/2) |