입력 : 이미 정렬 된 배열이 array_to_search를 검색 할, 당신은 왼쪽에서 오른쪽으로, 국경을 찾아, 숫자의 번호를 찾을 필요가있다.
출력 : array_to_search에 위치 개수 -1 출력 찾으면 없음.
아이디어의 실현
- 어레이 array_to_search [중앙]의 중간 요소가 검색 수가 동일한 경우, 단부를 찾는데 성공한 것으로 숫자와 비교된다;
- array_to_search [중간]> 수가 수가 포기 절반 크기를 찾기 위해 상기 array_to_search 전반 발생 후반 찾게 가능성 만이면 1 단계로 복귀;
- array_to_search [중앙]는 <수가 수가 포기 절반으로 크기를 찾기 위해 상기 array_to_search의 후반부에서 발생 전반 찾게 가능성 만이면 1 단계로 복귀;
- 그것은 1 = 아직 발견되지 수의 규모를 찾을 수있는 경우에는 숫자, 끝은없는 배열을 찾을 수 있습니다.
두 가지 예
성공을 찾기
输入: array_to_search = [ 1, 7, 12, 16, 24, 28, 34, 39 , 번호 = 34 = 7 오른쪽, 왼쪽 = 0
중간 = (0 + 7) = 3 // 2, array_to_search [중간] = (16)는, 다음과 같은 상태가된다 array_to_search 수보다 :
[1, 7, 12, 16, 24, 28, 34, 39 ] 중간 = (4 + 7) // 2 = 5 array_to_search [중간] = (28)는, 다음과 같은 상태가된다 array_to_search 수보다 :
[1, 7, 12, 16, 24, 28, 34, 39 ] 숫자, 알고리즘이 종료 동일 중간 = (6 + 7) // 2 = 6 array_to_search [중간] = 34
실패 찾기
输入: array_to_search = [ 1, 7, 12, 16, 24, 28, 34, 39 , 번호 = 3 = 7, 오른쪽 = 0 왼쪽
중간 = (0 + 7) = 3 // 2, array_to_search [중간은 다음과 같이 상태가된다 array_to_search, 16보다 큰 수 =
[ 1, 7, 12 , 16, 24, 28, 34, 39] 다음과 같은 수보다 많은 중간 = (0 + 2) // 2 = 1 array_to_search [중간] = 7, array_to_search 상태가된다 :
[ 1 , 7, 12, 16, 24, 28, 34, 39] 중간 = (0 + 0) // = 0 (2), array_to_search [중간] = 1, 의한 문제의 스케일의 수보다 적은 것은 이미 1, 알고리즘을 종료한다 룩업 실패.
플로우 차트
전체 알고리즘 (파이썬 구현)
from random import uniform
def binary_search(array_to_search, number, left, right):
index = -1
while(left <= right):
middle = (left + right) // 2
if array_to_search[middle] == number:
index = middle
break
elif array_to_search[middle] > number:
right = middle - 1
else:
left = middle + 1
return index
if __name__ == '__main__':
array_size = int(input("Please input the length of array:"))
array_to_search = [int(uniform(0, 5)) + 5 * i for i in range (0, array_size)]
print("Init array:", array_to_search)
number = int(input("Please input the number you want to search:"))
# start search
print("\n\n")
print("######################")
print("## Start searching! ##")
print("######################")
print("")
print("Binary Search:", binary_search(array_to_search, number, 0, len(array_to_search)))
시간 복잡도
길이 N의 배열, 및 각 시각에 대한 원래의 중간 부재의 축척과 비교 \ (\ FRAC. 1} {2} {\) 이므로 후 \ (\ log_2n \) 의 비교 후, 크기 1로 감소되므로 이진 탐색 시간의 복잡성은한다 \ (O (\ log_2n) \) .